Python Gtk应用程序中的线程

时间:2017-06-17 21:39:42

标签: python gtk python-multithreading glade

我正在尝试创建一个显示陀螺仪位置数据的程序。我一直在使用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的情况下做到这一点吗?

1 个答案:

答案 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)