2011-02-06 47 views
3

我写一个GUI程序,它允许用户重复发送消息到一个电话号码,重复可配置的延迟和数量。使用gobject.timeout_add_seconds - 段错误

我用QT设计器创建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_()) 

回答

3

你似乎是使用(PY)Qt应用程序内的(PY)GTK定时器对象。尝试用等价PyQt的代码

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

我能够重现使用gobject.timeout_add_seconds的段错误更换

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

,它走了一次,我更换了PyGTK的计时器与PyQt的一个。我不能确定为什么出现这种情况,但this article给出了一个可能的原因:

一个警告,我发现,gobject.timeout_add_seconds()似乎依赖于GTK主循环,所以你不能从常规使用非GTK python应用程序。

+0

谢谢您的帮助!这正是我所需要的。 – xur17 2011-02-06 20:03:16