使用gobject.timeout_add_seconds - 段错误
我正在写一个图形界面程序,用户可以设置延迟和重复次数,反复向一个电话号码发送消息。
我用QT Designer设计了这个界面,现在我在尝试编写背后的代码。我希望程序在按下开始按钮时开始发送消息,但又不想让界面卡住。
我想用gobject.timeout_add_seconds每秒检查一次是否需要发送新消息,但这样做导致了段错误。
每当按下按钮开始发送消息时,queueMessages函数就会被调用,而sendMessages函数应该每秒运行一次,以发送需要发送的消息。
如果有更简单的方法(比如使用线程),请告诉我。我对其他想法也很开放。
这是相关的代码。如果需要,我也可以提供图形界面的代码:
#!/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_())
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
复现了程序崩溃的问题,但当我把 PyGTK 的定时器换成 PyQt 的定时器后,这个问题就消失了。我不太确定为什么会这样,但这篇文章提供了一个可能的原因:
我发现的一个注意事项是,gobject.timeout_add_seconds() 似乎依赖于 GTK 的主循环,所以你不能在一个普通的非 GTK 的 Python 应用程序中使用它。