我有这个程序建立连接。当它试图连接时,它会创建一个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()
答案 0 :(得分:1)
我怀疑你在进行最后一次Pulse()的过程中正在销毁进度对话框。有时某些平台会将特定API的部分处理推迟到第一部分完成之后或之后。如果你延迟调用Destroy,你可能会有更好的结果。尝试:
wx.CallAfter(self.pd.Destroy)
此外,对于像更新UI元素这样的事情,每秒60次非常快。这比眼睛看到的要快得多,并且可能导致某些事件堆积起来,处理程序以意外的顺序被调用,例如获取计时器事件并在对话框被销毁后尝试执行Pulse()。相反,每秒尝试10或20次。
答案 1 :(得分:0)
我发现需要ShowModal(),例如
dlg = wx.ProgressDialog(title, msg, maximum=100)
dlg.ShowModal()
dlg.Update(0, "Please Wait...")
...
dlg.Destroy()
如果没有ShowModal(),应用程序会在下次尝试显示另一个进度对话框时崩溃。