PyGObject-我调用函数时GtkSpinner没有旋转-为什么?

时间:2018-08-30 21:17:02

标签: gtk3 pygtk pygobject

我有一个简单的Python / GTK应用程序。我有一个可以完成任务的函数,在完成所述任务之前,GtkSpinner应该会旋转。

这是我的代码:

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

class Handler:

def on_main_window_destroy(self, *args):
    Gtk.main_quit()

def on_button_clicked(self, *args):
    print("button clicked")
    self.dostuff()

def dostuff(self):
    app.spinner.start()
    print("I'm doing stuff")
    time.sleep(3)
    print("I'm done")
    app.spinner.stop()

class MainApp():

def __init__(self):
    self.builder = Gtk.Builder()
    self.builder.add_from_file("test.glade")
    self.builder.connect_signals(Handler())
    self.main_window = self.builder.get_object("main_window")
    self.main_window.show()

    self.spinner = self.builder.get_object("spinner")

def main(self):
    Gtk.main()

if __name__ == "__main__":
app = MainApp()
app.main()

time.sleep()命令不是问题。如果我用实际的“工作”代替它,也会发生同样的事情。微调器未启动/未激活。

那是为什么?每个命令都是逐行处理的。那么,有什么东西可以阻止?如果我用简单的print()语句替换Spinner-code,它们的输出将与您期望的一样。我没有计算机科学学位,只是一个业余爱好者。有没有我不明白的概念吗?

我需要更改什么,以便我的微调器在任务开始前启动,并在任务完成后停止?

非常感谢!

编辑:这是我的Glade文件:https://pastebin.com/UDUinH1d

2 个答案:

答案 0 :(得分:0)

我自己弄清楚了。由于某些原因(我不太了解),即使应该逐行执行Python脚本,GTK GUI也没有响应。由于某些原因,PyGObject似乎并非如此。因此,唯一的解决方案是仅将其线程化,现在看起来像这样:

    t = threading.Thread(target=dostuff, args=(optional, arguments, go, here))
    app.spinner.start()
    t.start()

答案 1 :(得分:0)

您在主要代码中使用( time.sleep ),但是( sleep )停止了所有脚本,并且旋转。我使用( thread )作为第二个进程来启动它。

检查。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time, gi, thread
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class MainApp():
    def __init__(self):
        self.builder = Gtk.Builder()
        self.builder.add_from_file("test.glade")
        self.main_window = self.builder.get_object("main_window")
        self.main_window.connect("destroy", self.quit);

        self.spinner = self.builder.get_object("spinner")

        self.button = self.builder.get_object("button")
        self.button.connect("clicked", self.on_button_clicked);

        self.main_window.show()

    def main(self): Gtk.main()
    def quit(self, widget): Gtk.main_quit();

    def sleep_and_stop(self, data = None):
        time.sleep(3);
        print("I'm done");
        self.spinner.stop();

    def on_button_clicked(self, widget = None, data = None):
        self.spinner.start();
        print("I'm doing stuff");
        thread.start_new_thread(self.sleep_and_stop, (None,));

if __name__ == "__main__": MainApp().main();