我试图在单击按钮时禁用它,并在使用多处理调用的函数完成后重新启用它。
目前,每次我尝试访问函数中的该按钮时,它基本上都会给我一个空引用。
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(parent=None, title='Title', size=(800, 500), style=wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX)
panel = wx.Panel(self)
self.my_btn = wx.Button(panel, label='Label me')
self.my_btn.Bind(wx.EVT_BUTTON,self.on_press)
self.Show()
def two(self):
self.my_btn.Enable()
def on_press(self, event):
self.my_btn.Disable()
Process(target=one).start()
def one():
#something
MyFrame.two(MyFrame)
我希望一旦完成按钮即可重新启用。但无论我尝试什么,它要么是类型错误,要么是属性错误。
最佳答案
您必须记住,一旦调用 Process(...).start(),就会有 2 个不相关的进程。他们不能直接访问彼此的变量。所以很容易理解的可能性是:
- 在 on_press 中执行: self.process = Process(target=one); self.process.start()
- 启动一个计时器(wx.Timer),定期检查 self.process 是否仍在运行(self.process.is_alive())
- 一旦进程不再处于事件状态,您就可以启用该按钮。
您可能认为“轮询” self.process 不是最理想的,但它几乎不需要任何成本,并且如果您调用它(例如每秒 20 次),进程结束和按钮重新启用之间的延迟将不会增加不引人注目。
其他选项是启动另一个线程并执行 self.process.join()。但请记住,您不能只从线程中调用 self.btn.Enable。使用wx.CallAfter。 (一般来说只能在主线程调用wx函数)。
您当然可以使用管道或队列在这两个进程之间进行通信,例如,如果您需要发回结果。
关于python - 如何在多处理函数中使用 wxPython 启用/禁用按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58595183/