簡體   English   中英

如何使用wxPython將值正確繼承到線程類中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM