wxPython app:没有错误但仍然冻结

时间:2012-01-24 23:05:01

标签: python wxpython freeze

我的代码没有任何错误,但在我点击垃圾邮件按钮后,它会冻结,没有任何反应。有没有人看到代码有什么问题?

    import Skype4Py, wx, time as t


    skype = Skype4Py.Skype()
    skype.Attach()
    name = ""
    chat = ""
    message = ""


    class skyped(wx.Frame):

        def __init__(self,parent,id):
            wx.Frame.__init__(self,parent,id,"Skype Chat Spammer",size=(300,200))
            panel=wx.Panel(self)
            start=wx.Button(panel,label="Spam!",pos=(140,100),size=(50,20))
            stop=wx.Button(panel,label="Stop!", pos=(200,100),size=(50,20))
            self.Bind(wx.EVT_BUTTON, self.spam, start)
            self.Bind(wx.EVT_CLOSE, self.closewindow)
            entered=wx.TextEntryDialog(None, "User to spam?", "User", "Username Here")
            if entered.ShowModal()==wx.ID_OK:
                name=entered.GetValue()
            entered1=wx.TextEntryDialog(None, "Message?", "Message", "Message Here")
            if entered1.ShowModal()==wx.ID_OK:
                message=entered1.GetValue()

        def spam(self,event):
            global chat
            global name
            global message
            chat = skype.CreateChatWith(name)
            while 1:
                chat.SendMessage(message)

        def closewindow(self,event):
            self.Destroy()

    if __name__=="__main__":
        app=wx.PySimpleApp()
        frame=skyped(parent=None,id=-1)
        frame.Show()
        app.MainLoop()

2 个答案:

答案 0 :(得分:2)

建立kotlinski的答案,是的,因为你在你的应用程序的主线程中进行无限循环,所以它会冻结。该应用程序无法再处理任何与gui相关的交互或事件。

虽然我不太了解wx,但理论与PyQt相同。任何长时间运行或繁重的提升操作都不应该阻止应用程序的主线程。这些应该在不同的线程中运行并与信号通信:

http://wiki.wxpython.org/LongRunningTasks

您的主线程应始终清晰,以处理用户与小部件的交互。

答案 1 :(得分:0)

它可能会冻结,因为你的应用程序在这里进入无限循环:

    while 1:
        chat.SendMessage(message)