2017-06-17 39 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参数中,但是当我运行它时它仍然冻结。我需要这个在程序继续运行时更新标签。 –