PyGObject标签问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyGObject标签问题相关的知识,希望对你有一定的参考价值。

在我的应用程序中,当我从api获取新数据时,我正在尝试更改标签文本。我的问题是经过一段时间我的gui挂断了。并且它并不总是在它开始运行应用程序之后它有权在它运行半小时之后立即停止运行。

它只有挂起的gui,程序本身一直在运行,仍然可以在控制台上输出。

标签文本的更新在一个额外的线程中运行。

class GUI():
def get_assets(self,trader):
    assets={}
    if trader=="kraken":
        pass
    elif trader=="cex":
        query=info_CEX()
        res=query.get_balance()
        for key in res:
            try:
                assets[key]={}
                assets[key]["available"]=res[key]["available"]
                assets[key]["orders"]=res[key]["orders"]  
            except(KeyError,TypeError):
                continue
        return assets

def update_asset_labels(self,trader):
    assets=self.get_assets(trader)
    for key in assets:
        try:
            label=self.builder.get_object("BX"+key)
            label.set_text(str(float(assets[key]["available"]))+"/"+str(float(assets[key]["orders"])))
        except(AttributeError):
            if key=="EUR":
                label=self.builder.get_object("kapital")
                label.set_text(str(float(assets[key]["available"])))
            continue





def app(self):
    """Initialisiert die graphischen Oberfläche.
    """ 
    UI_FILE = PFAD+"/PYtraderGUI.ui"
    self.builder = Gtk.Builder()
    self.builder.add_from_file(UI_FILE)
    self.builder.connect_signals(self)
    self.window = self.builder.get_object("window1")
    """self.window.maximize()"""
    self.window.show_all()


    def update_info():
        price=["None"] * 11
        oldprice=["None"] * 11
        chan=0
        start_price=0
        query=infokraken.infokraken()
        trader="cex"
        while True:
            try:
                self.update_asset_labels(trader)
                pass
            except (ValueError):
                continue

    thread1 = threading.Thread(target=update_info)
    thread1.daemon = True
    thread1.start()

if __name__ == "__main__":
    GObject.threads_init()
    GO=GUI()
    GO.connect("delete-event", Gtk.main_quit)
    GO.show_all()
    GO.app()
    Gtk.main()
答案

我建议阅读GTK +,它正在使用线程。 IIRC(已经有一段时间了)您不应该从线程直接对GUI进行更改。相反,你应该通过GLib的idle_add(callable)函数来做到这一点。此功能应安排将更改设置为GUI空闲时。

看一下PyGObject用户指南中有关线程和并发的example。另外,请阅读本节底部的“主题:常见问题解答”部分。

另一种方法是使用队列或管道在主GUI线程和工作线程之间进行通信。让主线程对GUI进行更改。

以上是关于PyGObject标签问题的主要内容,如果未能解决你的问题,请参考以下文章

带有 pygobject 的 pango 属性

如何通过代码设置片段标签?

Windows 上的 PyGObject

用 pygobject 编写 D-Bus 服务?

PyGObject GTK+ 3 - 文档?

如何使用 PyGObject 使窗口居中