[我试图在单击按钮时禁用它,并在通过多处理调用的函数完成后重新启用它。
当前,每次我尝试访问该功能中的按钮时,它基本上给了我一个空引用。
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)
我希望按钮完成后可以重新启用。但是无论我尝试使用哪种类型的TypeError或AttributeError。
您必须记住,一旦调用Process(...)。start(),就有2个不相关的进程。他们不能直接访问彼此的变量。因此,很容易理解的可能性是:
您可能认为“轮询” self.process不太理想,但是几乎不花任何费用,如果您以每秒20次的速度调用它,则过程结束与按钮重新启用之间的延迟不会引人注意。
其他选择是启动另一个线程并执行self.process.join()。但是请记住,您可能不只是从线程中调用self.btn.Enable。使用wx.CallAfter。 (通常来说,您只能从主线程调用wx函数)。
当然,您可以使用管道或队列在这两个进程之间进行通信,例如,如果您需要将结果发送回去。