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

PyGObject - GtkSpinner is not spinning when I call a function - Why?

我有一个简单的 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() 命令不是问题所在。如果我用实际的 "work" 替换它,同样的事情也会发生。微调器不是 started/activated.

这是为什么?每个命令都是逐行处理的。那么怎么会有任何阻塞呢?如果我用简单的 print() 语句替换 Spinner 代码,它们将按照您的预期输出。我没有 CS 学位,我只是一个爱好者。有什么我不明白的概念吗?

我需要更改什么才能让我的 Spinner 在任务开始之前启动并在任务完成之后停止?

提前致谢!!

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

我自己想出来了。出于某种原因(我不太明白)GTK GUI 没有响应,即使 Python 脚本应该逐行执行。由于某种原因,PyGObject 似乎并非如此。所以唯一的解决办法就是穿线,现在看起来像这样:

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

您在主代码中使用了 ( 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();