wxPython:ProgressDialog崩溃

2024-09-27 07:19:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个建立联系的程序。当它试图连接时,它会创建一个ProgressDialog。当连接失败时,它应该干净地关闭ProgressDialog,但是它没有,它会分离故障。在

下面是有关代码的简化示例。您可以通过运行此脚本并按几次enter来复制此行为,这将单击应用程序中的“唯一”按钮并触发代码以尝试连接。在

到目前为止,我只知道应用程序只有在第53行“print('after_pulse')”不运行时才会崩溃,这说明“pulse”调用有问题,但我不知道是什么。在

有人知道是什么导致代码崩溃吗?在

如果没有,你能至少复制这种行为吗?在

规格:

Ubuntu 12.04版

Python 2.7.3

wxPython 2.8.12.1版

编辑:更小的例子程序没有扭曲的代码。在

#!/usr/bin/env python

'''test2'''

import wx   # Must be imported before any other wx modules


class TestFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title='TestFrame')
        self.button = wx.Button(self, label='test')
        self.button.Bind(wx.EVT_BUTTON, self.button_handler)
        self.button.SetFocus()

    def button_handler(self, event):
        pd_style = wx.PD_APP_MODAL|wx.PD_CAN_ABORT|wx.PD_SMOOTH
        self.pd = wx.ProgressDialog('test_title', 'test_msg', parent=self,  
                                    style=pd_style)
        self.pd.SetFocus()

        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.on_timer, self.timer)
        self.timer.Start(1000/60, False)

        wx.CallAfter(self.err_connection)

    def on_timer(self, event):
        print('before_pulse')
        cont, _skip = self.pd.Pulse()
        print('after_pulse')
        if not cont:
            self.err_connection()

    def err_connection(self):
        print('err_connection')
        self.timer.Stop()
        self.pd.Destroy()
        self.button.SetFocus()


def main():
    app = wx.App()
    frame = TestFrame()
    frame.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

Tags: 代码testselfdefbuttonconnectionpdpulse
2条回答

我发现showmodel()是必需的,例如

dlg = wx.ProgressDialog(title, msg, maximum=100)
dlg.ShowModal()
dlg.Update(0, "Please Wait...")
...
dlg.Destroy()

如果没有showmodel(),应用程序将在下次尝试显示另一个进度对话框时崩溃。在

我怀疑您正在销毁进程对话框,而它仍在执行最后一个Pulse()。有时,某些平台会将特定API的部分处理推迟到稍后,即第一部分完成之后或其他什么时候。如果你延迟调用销毁你可能会有更好的结果。尝试:

wx.CallAfter(self.pd.Destroy)

另外,对于更新UI元素之类的事情来说,每秒60次是非常快的。这比肉眼所能看到的要快得多,并且可能导致一些事件堆积起来,并以意外的顺序调用处理程序,例如获取计时器事件并在对话框被破坏后尝试执行Pulse()。试试每秒10到20次。在

相关问题 更多 >

    热门问题