2017-06-17 78 views
0

我想創建一個程序,顯示來自陀螺儀的位置數據。我一直在使用threading.Thread模塊來達到這個目的。我還必須使用time.sleep()來防止它從蝙蝠墜落。我的問題是運行一段時間後,程序有時會凍結。它是這樣實現的:線程在Python的Gtk應用程序

def get_gyro_data(): 
    return <the data from the gyro> 

class Handler: 
    def __init__(self): 
     self.label = builder.get_object("my_label") 
     threading.Thread(target=self.pos_data_update).start() 

    def pos_data_update(self, *args): 
     while True: 
      self.label.set_text(get_gyro_data()) 
      time.sleep(.5) 

有什麼建議嗎?還有一種方法,我可以做到這一點,而不使用time.sleep?

回答

1

Gtk不是線程安全的。 GUI的所有更改都應該由主線程(運行主循環的主線程)完成。

我喜歡用下面的函數:

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, Gdk, GLib 

def mainloop_do(callback, *args, **kwargs): 
    def cb(_None): 
     callback(*args, **kwargs) 
     return False 
    Gdk.threads_add_idle(GLib.PRIORITY_DEFAULT, cb, None) 

這可以讓你的工作通過以最小的改動你的代碼在主線程:

def pos_data_update(self, *args): 
    while True: 
     mainloop_do(self.label.set_text, get_gyro_data()) 
     time.sleep(.5) 
+0

我碰到下面的錯誤當試圖使用此功能: 回溯(最近通話最後一個): 文件 「program.py」 25行,在CB 回調(* ARGS,** kwargs) 類型錯誤: '元組' 對象不是馬蹄蓮竹葉提取 回溯(最近通話最後一個): 文件 「program.py」 25行,在CB 回調(* ARGS,** kwargs) 類型錯誤: '元組' 對象不是可調用 –

+0

@DanielCopley聽起來像是你傳遞一個元組作爲'callback'參數。我經常使用這個功能,我敢肯定它的工作原理。 –

+0

好了,我意識到我在那裏做錯了,我已經將「self」插入到mainloop_do參數中,但是當我運行它時它仍然凍結。我需要這個在程序繼續運行時更新標籤。 –