3

我正在编写一个 gui 程序,它允许用户以可配置的延迟和重复次数重复向电话号码发送消息。

我使用 QT Designer 创建了一个 gui,现在我正在尝试创建它背后的代码。我试图让程序在按下开始按钮时开始发送消息,但不冻结 gui。

我正在尝试使用 gobject.timeout_add_seconds 检查是否需要每 1 秒发送一次新消息,但是当它导致分段错误时。

每当按下按钮开始发送消息时都会调用 queueMessages,并且 sendMessages 应该每 1 秒运行一次以发送任何需要的消息。

让我知道是否有更简单的方法(例如线程)。我对任何其他想法持开放态度。

这是适用的代码。如果有帮助,我也可以包含 gui 代码:

#!/usr/bin/python2.5
import sys, os
import time
import gobject
from PyQt4 import QtGui,QtCore
from smsBomb import *

class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        #build parent user interface
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        # Create button actions
        QtCore.QObject.connect(self.ui.btnSendMessages, QtCore.SIGNAL('clicked()'), self.queueMessages)
        # Check if we need to send any messages every 1s.
        self.maintimer = gobject.timeout_add_seconds(1, self.sendMessages)

    def queueMessages(self):
        # Queue messages!
        number = str(self.ui.txtNumber.text())
        message = str(self.ui.txtMessage.text())
        delay = int(self.ui.txtDelay.text())
        repetitions = int(self.ui.txtRepetitions.text())
        for i in range(repetitions):
            os.system('dbus-send --dest=org.QGVDial.TextServer --session --print-reply /org/QGVDial/TextServer org.QGVDial.TextServer.Text array:string:"+1' + number + '" string:"' + message + '"')
            #time.sleep(delay)

    def sendMessages(self):
        # Send Queued Messages as needed
        print "Sending queued messages..."
        return True

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())
4

1 回答 1

4

您似乎在 (Py)Qt 应用程序中使用 (Py)GTK 计时器对象。尝试更换

    self.maintimer = gobject.timeout_add_seconds(1, self.sendMessages)

使用等效的 PyQt 代码

    self.maintimer = QtCore.QTimer(self);
    self.connect(self.maintimer, QtCore.SIGNAL('timeout()'), self.sendMessages)
    self.maintimer.start(1000)

我能够使用 重现段gobject.timeout_add_seconds错误,一旦我用 PyQt 替换了 PyGTK 计时器,它就消失了。我不确定为什么会发生这种情况,但这篇文章给出了一个可能的原因:

我发现一个警告, gobject.timeout_add_seconds() 似乎依赖于 GTK 主循环,因此您不能从常规的非 GTK python 应用程序中使用它。

于 2011-02-06T18:36:55.947 回答