所以我有一個按鈕,一旦按下按鈕,它就會以回圈方式執行一個功能。一旦被釋放,函式就會停止執行。
現在,由于某種原因,一旦我松開按鈕,該功能就會再執行一次。
您可以在下面找到我用來創建按鈕的代碼
self.sch_minus_button = tk.Button(self, text="S-", command=lambda: self.button_hold_callback('sch_minus'))
self.sch_minus_button.bind('<Button-1>', lambda event: self.button_hold_callback('sch_minus', event))
self.sch_minus_button.bind('<ButtonRelease-1>', self.button_stop_callback)
這button_hold_callback是管理我按下按鈕后必須回圈的功能的功能
def button_hold_callback(self, *args):
global repeat
global last_call
try:
repeat = self.after(250, self.button_hold_callback, args[0], args[1])
except IndexError:
pass
self.ser.reset_input_buffer()
self.ser.reset_output_buffer()
if not last_call:
self.ser.write(self.message_to_send(args[0]))
logging.info('Sent message ' str(self.message_to_send(args[0])))
# logging.info("write on serial")
self.ser.reset_input_buffer()
self.ser.reset_output_buffer()
button_stop_callback而是在釋放按鈕后立即阻止回圈
def button_stop_callback(self, event):
last_call = True
for x in range(0,10):
self.ser.write(b'\x02\x56\xff\xff\xff\xff\xff\xff\x32\x35\x04')
time.sleep(0.01)
logging.debug("Written stop on the serial")
self.after_cancel(repeat)
由于某種原因,即使button_stop_callback函式執行正確,似乎button_hold_callback又執行了一次。
我在日志記錄中發現了這種奇怪的行為,一旦我釋放按鈕,我就有另一個日志告訴我另一個資料包已在串行上發送
2022-05-13 11:19:23,956 - root - INFO - created serial port (GUI.py:43)
2022-05-13 11:19:25,107 - root - INFO - Sent message b'\x02V\x81\x80\x80\x80\x80\x8095\x04' (GUI.py:84)
2022-05-13 11:19:25,373 - root - INFO - Sent message b'\x02V\x81\x80\x80\x80\x80\x8095\x04' (GUI.py:84)
2022-05-13 11:19:25,623 - root - INFO - Sent message b'\x02V\x81\x80\x80\x80\x80\x8095\x04' (GUI.py:84)
2022-05-13 11:19:25,888 - root - INFO - Sent message b'\x02V\x81\x80\x80\x80\x80\x8095\x04' (GUI.py:84)
2022-05-13 11:19:26,136 - root - DEBUG - Written stop on the serial (GUI.py:67)
2022-05-13 11:19:26,136 - root - INFO - Sent message b'\x02V\x81\x80\x80\x80\x80\x8095\x04' (GUI.py:84)
我已經在除錯模式下輸入了代碼,出于某種原因,如果我在代碼的每一步都設定斷點,一切都會順利進行。在生產中存在以下問題
任何的想法?
uj5u.com熱心網友回復:
因此,我發現了一種解決方法,一旦呼叫了釋放按鈕回呼,就會殺死序列,并在最后一次呼叫try except函式時再次打開button_hold_callback
def button_stop_callback(self, event):
self.ser.reset_output_buffer()
self.ser.write(b'\x02\x56\xff\xff\xff\xff\xff\xff\x32\x35\x04')
logging.debug("Written stop on the serial")
self.ser.close()
self.after_cancel(repeat)
# ---- CALLBACK MANTIENE L'ESECUZIONE DELLA FUNZIONE CON TASTO PREMUTO
def button_hold_callback(self, *args):
global repeat
try:
repeat = self.after(250, self.button_hold_callback, args[0], args[1])
except IndexError:
pass
try:
self.ser.reset_input_buffer()
self.ser.reset_output_buffer()
self.ser.write(self.message_to_send(args[0]))
logging.info('Sent message ' str(self.message_to_send(args[0])))
# logging.info("write on serial")
self.ser.reset_input_buffer()
self.ser.reset_output_buffer()
# ---- SE FALLISCE PORTA SERIALE CHIUSA
except:
self.ser.open()
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475796.html
