我正在尝试创建一个显示陀螺仪位置数据的程序。我一直在使用threading.Thread模块。我还必须使用time.sleep()来防止它立即崩溃。我的问题是它运行了一段时间后程序有时会冻结。实现如下:
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的情况下做到这一点吗?
答案 0 :(得分: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)