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

标签 python wxpython python-multiprocessing

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

目前,每次我尝试访问函数中的该按钮时,它基本上都会给我一个空引用。

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/

相关文章:

python - wxpython tree ctrl 图片

Python多处理池: Why doesn't adding additional processes seem to improve performance on a hyperthreaded system?

python - 如何优化 pandas 数据框的分块?

python - mysql-python 连接器同时适用于 python2.7 和 3.4

python - 矩阵翻转水平或垂直

python - 运行 wxPython2.8 文档和演示附带的教程时出错

python-2.7 - 在Python多处理中,当子进程完全存在时,标准输出会发生什么?

python - 确定异常类型的最佳方法

python - pyspark 将两个 rdd 合并在一起

python - wxPython 对话框 : "Enter" keyboard button would not "ok" the dialog