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();
我有一个简单的 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();