Python Gtk应用程序中的动画gif

Python Gtk应用程序中的动画gif,python,gtk,animated-gif,Python,Gtk,Animated Gif,我用Python、Glade和Gtk编写了一个应用程序。 我喜欢在这个应用程序中使用动画GIF。 所以我修改了我的代码,它用于显示PNG。但遗憾的是,GIF中的动画没有显示,只是一幅静态图像 from gi.repository.GdkPixbuf import PixbufAnimation class Mealscanner: def __init__(self): self.builder = Gtk.Builder() self.app_pat

我用Python、Glade和Gtk编写了一个应用程序。 我喜欢在这个应用程序中使用动画GIF。 所以我修改了我的代码,它用于显示PNG。但遗憾的是,GIF中的动画没有显示,只是一幅静态图像

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>

真的
假的
真的
真的
资产/trans.png
有什么提示吗

解决方案:


超时时间很短,因此动画gif每10毫秒重新加载一次-动画速度较慢。增加超时时间后,将显示动画。

请参阅我对问题的编辑。如果Gtk.Builder.get_object()提供了正确的对象,那么signallight就是GtkImage。对我来说是有效的,将显示的代码与
模板一起使用。glade Hello@stovl:我用另一个动画gif进行了双重检查。同样的结果。显示gif,但不显示动画。在使用Gnome 3.34的Debian Bullseye上运行python 3.7-可能有问题吗?哈!诀窍是删除“return True”!知道了!只需将超时时间增加几毫秒,这样动画gif就不会每10毫秒加载一次!在那之后,一切都如愿了!感谢斯托夫的耐心。