анимированный GIF в приложении Pyhton Gtk - PullRequest
0 голосов
/ 24 февраля 2020

Я написал приложение с Python, Glade и Gtk. Мне нравится использовать анимированный GIF внутри этого приложения. Поэтому я изменил свой код, который работал для отображения PNG. Но, к сожалению, анимация внутри GIF не отображается, просто изображение c.

from gi.repository.GdkPixbuf import PixbufAnimation

class Mealscanner:

    def __init__(self):
        self.builder = Gtk.Builder()
        self.app_path = os.path.dirname(os.path.abspath(__file__))
        self.builder.add_from_file(os.path.join(self.app_path, "template.glade"))

    def upd_signal(self):
        signallight = self.builder.get_object("signal")  # changing signal light
        if (self.scanner.get_status() == self.scanner.STATUS_CREW_OK or self.scanner.get_status() == self.scanner.STATUS_MEAL_OK):
            if (self.scanner.get_status() == self.scanner.STATUS_CREW_OK):
                pic = Pixbuf.new_from_file(os.path.join(self.app_path, "assets", "scan_next.png"))
            if (self.scanner.get_status() == self.scanner.STATUS_MEAL_OK):
                pic = Pixbuf.new_from_file(os.path.join(self.app_path, "assets", "green.png"))
                self.log.get_buffer().set_text(self.scanner.display_last_orders())
            signallight.set_from_pixbuf(pic)
        elif (self.scanner.get_status() == self.scanner.STATUS_ERROR or self.scanner.get_status() == self.scanner.STATUS_MEAL_ERROR):
            pic = Pixbuf.new_from_file(os.path.join(self.app_path, "assets", "red.png"))
            signallight.set_from_pixbuf(pic)
        elif (self.scanner.get_status() == self.scanner.STATUS_IDLE):
            signallight = self.builder.get_object("signal")  # changing signal light
            if (self.scanner.get_status() == self.scanner.STATUS_IDLE):
                inforight.set_text(".-._.-._ Bereit für CREW-Scan _.-._.-.")
                pixbufanim = PixbufAnimation.new_from_file(os.path.join(self.app_path, "assets", "greycode.gif"))
                pixbufanim.get_iter()
                signallight.set_from_animation(pixbufanim)
        retrun True

    # some more methods

    def run(self):
        try:
            self.start_timer()
            GLib.timeout_add(10, self.upd_signal)
            Gtk.main()
        except KeyboardInterrupt:
            pass

    def quit(self):
        self.scanner.db.close()
        Gtk.main_quit()


if __name__ == '__main__':
    app = Mealscanner()
    app.run()

, где template.glade определяет объект как GtkImage:

          <object class="GtkImage" id="signal">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="hexpand">True</property>
            <property name="vexpand">True</property>
            <property name="pixbuf">assets/trans.png</property>
            <style>
              <class name="signal"/>
            </style>
          </object>

Любые подсказки на this?

РЕШЕНИЕ:

Время ожидания было коротким, поэтому анимированный GIF перезагружался каждые 10 мсек - анимация была медленнее. После увеличения тайм-аута была показана анимация.

...