Как включить / отключить кнопку с помощью wxPython в многопроцессорной функции? - PullRequest
1 голос
/ 28 октября 2019

Я пытаюсь отключить кнопку, когда я нажимаю на нее, и повторно включить ее, как только функция, вызываемая с помощью многопроцессорной обработки, завершена.

В настоящее время каждый раз, когда я пытаюсь получить доступ к этой кнопке в функции, которую она в основном даетмне нулевая ссылка.

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.

1 Ответ

1 голос
/ 28 октября 2019

Вы должны помнить, что как только вы вызываете Process (...). Start (), у вас есть 2 несвязанных процесса. Они не могут просто напрямую обращаться к переменным друг друга. Таким образом, возможность, которую довольно легко понять, будет:

  • В on_press do: 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 из основного потока).

Конечно, вы можете общаться между этими двумя процессами, используя каналы или очереди, например, если вам нужно отправить результаты обратно.

...