2016-10-07 4 views
2

У меня есть правильно работающий код, я понимаю, что я не вставляю достаточно кода, но я объясню каждую команду надлежащими комментариями. Мой вопрос здесь в том, почему поведение кода, а не то, что я ожидал от него.Python - wxPython Последовательность выполнения команды

Мой код:

def OnReset(self, event): # A function event which works after a button is pressed 

     self.reset_pump.Disable() # Disables the button so it is clicked 
     self.WriteToController([0x30],'GuiMsgIn') # Sends the reset command 
     self.flag_read.set() # Set Event of the thread 
     time.sleep(0.25) 
     self.tr.join() # Joining a Thread 

     self.MessageBox('Pump RESET going on Click OK \n') 
     # Having the above step is useful 
     # The question I have is based on the commands from here:  
     self.offset_text_control.Clear() 
     self.gain_text_control.Clear() 
     self.firmware_version_text_control.Clear() 
     self.pump_rpm_text_control.Clear() 
     self.pressure_text_control.Clear() 
     self.last_error_text_control.Clear() 
     self.error_count_text_control.Clear() 
     self.pump_model_text_control.Clear() 
     self.pump_serial_number_text_control.Clear() 
     self.on_time_text_control.Clear() 
     self.job_on_time_text_control.Clear() 
     # The above commands clear various widgets on my GUI. 

     self.ser.close() # Closes my serial connection to MCU 
     time.sleep(5) 

     self.OnCorrectComPort(event) # An external function which gets executed. This function has a Message BOX - which says - PORT IS OPENED. 

     return 

Я ожидаю, что после того, как поток присоединился - мои команды очистит GUI. Затем закройте последовательное соединение, используя (ser.close()). Затем выполняется self.OnCorrectComPort (событие).

Это то, что я вижу: Thread присоединяется к tr.join(), тогда self.OnCorrecComPort (event) выполняется, так как я вижу, что появляется окно с сообщением «PORT OPENED», я нажимаю OK, затем мой GUI получает CLEARED. Насколько я понимаю, это неправильно, кто-то, пожалуйста, поправьте меня.

ответ

1

Проблема заключается в том, что вы звоните time.sleep(5) и self.OnCorrectComPort() в обратный вызов, перед возвращения в основной цикл, где будут обрабатываться события.

Виджеты не будут отражать эффекты ваших вызовов Clear, пока вы не выйдете из обратного вызова в главный шлюз wx.

Что происходит, подпрограммы вы вызываете выполняются (занимает несколько секунд из-за time.sleep вызова, затем WX получает для обработки графических команд, а также виджеты очищаются в этот самый момент (который слишком поздно и графический интерфейс кажется застрял с предыдущим состоянием)

Если вы хотите, наоборот, вы можете использовать wx.CallAfter() оставить WX шанс обработать свои события перед вызовом подпрограммы.

в вашем случае, поскольку вы хотите подождать 5 секунд, риск снова заморозить ваш интерфейс. Еще лучше позвонить wx.CallLater() с задержкой 5 секунд в этом случае, оставляя время до wx для обновления всех виджетов.

Модифицированный код:

def OnReset(self, event): # A function event which works after a button is pressed 

     self.reset_pump.Disable() # Disables the button so it is clicked 
     self.WriteToController([0x30],'GuiMsgIn') # Sends the reset command 
     self.flag_read.set() # Set Event of the thread 
     time.sleep(0.25) 
     self.tr.join() # Joining a Thread 

     self.MessageBox('Pump RESET going on Click OK \n') 
     # Having the above step is useful 
     # The question I have is based on the commands from here:  
     self.offset_text_control.Clear() 
     self.gain_text_control.Clear() 
     self.firmware_version_text_control.Clear() 
     self.pump_rpm_text_control.Clear() 
     self.pressure_text_control.Clear() 
     self.last_error_text_control.Clear() 
     self.error_count_text_control.Clear() 
     self.pump_model_text_control.Clear() 
     self.pump_serial_number_text_control.Clear() 
     self.on_time_text_control.Clear() 
     self.job_on_time_text_control.Clear() 
     # The above commands clear various widgets on my GUI. 
     self.ser.close() # Closes my serial connection to MCU 
     # will call calledAfter after 5 seconds 
     wx.CallLater(5000,self.calledAfter,[ser,event]) 

    def calledAfter(self,ser,event): 
     self.OnCorrectComPort(event) # An external function which gets executed. This function has a Message BOX - which says - PORT IS OPENED. 
+0

Спасибо за ваш ответ - я не мог понять физику, что именно вы имеете в виду, я называю их в CallBack. Насколько я понимаю, wx также является Callback - что отличает его от time.sleep и FindCorrectComPORT. Разве я бы не назвал эти функции после вызова модуля wx. Даже если wx требует много времени, чтобы ответить, почему он не выполняет работу по очистке графического интерфейса пользователя в течение среднего времени. Буду признателен, если вы пойдете немного глубже. –

+0

Не следует ли обрабатывать события wx до вызова этих функций? Мой time.sleep - не должен быть 5 секунд. Одна вторая работа –

+0

Я отредактировал мое сообщение. События wx обрабатываются в mainloop. Вы не оставляете шанс на события. Плохо называть 'time.sleep' в системе с обратным вызовом: он замерзает все. Метод таймера намного лучше: wx обрабатывает его, и он может обновлять дисплей раньше. –

Смежные вопросы