如何在多处理函数中使用wxPython启用/禁用按钮?

问题描述 投票:0回答:1

[我试图在单击按钮时禁用它,并在通过多处理调用的函数完成后重新启用它。

当前,每次我尝试访问该功能中的按钮时,它基本上给了我一个空引用。

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。

python wxpython python-multiprocessing
1个回答
0
投票

您必须记住,一旦调用Process(...)。start(),就有2个不相关的进程。他们不能直接访问彼此的变量。因此,很容易理解的可能性是:

  • 在on_press中执行:self.process = Process(target = one).start()
  • 启动一个计时器(wx.Timer),该计时器定期检查self.process是否仍在运行(self.process.is_alive())
  • 一旦该过程不再存在,您可以启用该按钮。

您可能认为“轮询” self.process不太理想,但是几乎不花任何费用,如果您以每秒20次的速度调用它,则过程结束与按钮重新启用之间的延迟不会引人注意。

其他选择是启动另一个线程并执行self.process.join()。但是请记住,您可能不只是从线程中调用self.btn.Enable。使用wx.CallAfter。 (通常来说,您只能从主线程调用wx函数)。

当然,您可以使用管道或队列在这两个进程之间进行通信,例如,如果您需要将结果发送回去。

© www.soinside.com 2019 - 2024. All rights reserved.