PyGObject - GtkSpinner не вращается, когда я вызываю функцию - Почему? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть простое приложение 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 () не является проблемой. Если я заменяю это фактической «работой», происходит то же самое. Spinner не запускается / не активируется.

Почему это? Каждая команда обрабатывается построчно. Так как же можно что-то блокировать? Если я заменю код Spinner на простые операторы print (), они выводятся так, как вы этого ожидаете. У меня нет степени CS, и я просто увлекаюсь. Есть какая-то концепция, которую я не понимаю?

Что мне нужно изменить, чтобы мой Spinner запускался до запуска задания и останавливался после его завершения?

Большое спасибо заранее !!

РЕДАКТИРОВАТЬ: Это мой файл Glade: https://pastebin.com/UDUinH1d

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вы используете ( 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();
0 голосов
/ 31 августа 2018

Я понял это сам. По какой-то причине (которую я не совсем понимаю) графический интерфейс GTK не отвечает, хотя скрипт Python должен выполняться построчно. По какой-то причине это не относится к PyGObject. Таким образом, единственное решение состояло в том, чтобы просто заправить его, который теперь выглядит так:

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