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