[英]How to proper inherit values into thread class with wxPython
我有一個控制某些硬件的wxPython gui。 我需要一個按鈕在功能運行時禁用。 該函數還接收一個參數值
假設我具有綁定到按鈕按下的功能:
def button_press(self, event):
in_val = self.num_in.GetValue() #grabs a value from a NumCtrl
TheThread(in_val) #initiates the thread with argument
btn = event.GetEventObject()
btn.Disable() #disables button
此函數轉到以下線程類:
class TheThread(Thread):
def __init__(self, in_val):
"""Init Worker Thread Class."""
Thread.__init__(self)
self.run(in_val)
def run(self, in_val):
print val
time.sleep(5)
wx.CallAfter(Publisher.sendMessage, "ctrl")
"""
threadsafe method to call a pub.subscribe that runs a
function to re-enable button
"""
這不正確,因為gui在函數運行期間凍結,並且該按鈕未正確禁用。
如何正確繼承此參數以使其正常運行? 也許涉及self.start()方法的東西?
您對start
方法的猜測是正確的。
run
是在新線程上調用的方法, start
是您要調用以告訴Thread
對象執行此操作的方法。
在您的例子,通過調用run
自己,你要調用run
在主線程和線程沒有正在發生的一切。 (該線程永遠不會啟動)
class TheThread(Thread):
def __init__(self, in_val):
"""Init Worker Thread Class."""
Thread.__init__(self)
self.in_val = in_val
self.start()
def run(self):
print self.in_val
time.sleep(5)
wx.CallAfter(Publisher.sendMessage, "ctrl")
"""
threadsafe method to call a pub.subscribe that runs a
function to re-enable button
"""
不要從__init__()
調用run()
__init__()
。 run()
睡眠5秒鍾,然后返回。 但是__init__()
需要在對象完全實例化之前返回,並且調用代碼將阻塞直到__init__()
返回。 對於大多數函數調用,情況相同,即,調用代碼在繼續執行之前等待函數返回(對於生成器而言為yield)。
若要更正此問題,請從__init__()
刪除對run()的調用, start()
在TheThread()
實例上調用start()
方法:
def button_press(self, event):
in_val = self.num_in.GetValue()
TheThread(in_val).start()
btn = event.GetEventObject()
btn.Disable() #disables button
class TheThread(Thread):
def __init__(self, in_val):
"""Init Worker Thread Class."""
super(TheThread, self).__init__()
self.in_val = in_val
def run(self):
print self.in_val
time.sleep(5)
wx.CallAfter(Publisher.sendMessage, "ctrl")
您也可以在__init__()
調用線程的start()
方法,但是,更常見的方法是在線程實例本身上調用start。 這是一種更靈活的解決方案,因為可以先創建線程,然后再啟動線程,例如,如果您有一個線程池,其中先創建所有線程,然后一起啟動。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.