[英]Good approach for updating the GUI continuously in wxPython using threads?
[英]Writing to a serial link continuously from a GUI program: need to use threads?
我用PyQt4編寫了一個GUI程序,它必須通過串行數據鏈接發送消息字符串。
我已經實現了一個帶有兩個按鈕小部件的GUI界面。 我需要通過串行鏈接連續發送數據,單擊第一個按鈕時每秒一次,然后在單擊第二個按鈕時停止。
我當前的程序只能在單擊按鈕的瞬間發送數據。 這是我寫的處理按鈕點擊信號的方法:
def sendMessage(self):
while 1:
print "Hello........"
if checke == False:
break
我是否需要使用線程來解決這個問題?
是。 GUI編程的關鍵是永遠不要在主線程上進行任何長操作,因為它會阻止整個程序直到該操作完成。
如果要通過網絡連續發送數據,請在后台線程中進行。
一些示例代碼。
class MessageWorker(QtCore.QThread):
def __init__(self):
super(ParserWorker, self).__init__()
self.ok_to_send = False
self.terminated = True
def run(self):
while not self.terminated:
if self.ok_to_send:
self.send_message()
time.sleep(1)
def start_send():
self.ok_to_send = True
def pause_send():
self.ok_to_send = False
def terminated():
self.terminated = False
然后在主程序中調用
worker = MessageWorker()
worker.start() # Start the background thread
worker.start_send() # Start sending message
worker.pause_send() # Pause sending message
worker.terminated() # Stop sending message permanently
這取決於...如果發送操作很快,您可以使用QTimer類。 它與Qt事件循環集成,因此您不必擔心線程問題。 串行通信速度很慢,具體取決於您發送的數據量,因此我無法確定這是否適合您。
是的,你需要使用線程。 在任何基於GUI的程序中,任何需要花費大量時間的工作都應該始終在一個單獨的線程上進行,以避免阻塞UI - 每當看到“無響應”程序時,這幾乎總是由於程序失敗處理窗口消息,因為它的UI線程在一些長操作中被阻止。
啟動后台線程的一種簡單方法是使用threading
模塊 。 以下是如何使用它每秒將數據寫入串口一次:
class MyClass:
# This method will run on a separate thread
def _serial_port_worker(self):
while self._run_worker:
self.send_data_to_serial_port()
time.sleep(1)
# Call this to start the worker thread
def start_worker_thread(self):
self._run_worker = True
worker_thread = threading.Thread(target=self._serial_port_worker,
args=(self,))
worker_thread.start()
# Call this to tell the worker thread to stop
def stop_worker_thread(self):
self._run_worker = False
基本上你有三個選擇:
pyserial
,在Serial
對象中配置超時),否則您的應用可能會無響應。 multiprocessing
模塊從第二個程序進行串行通信。 即使第二個進程阻塞,也不會影響GUI。 您可以使用multiprocessing.Queue
在QUI和其他進程之間進行通信。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.