Python GTK 更新固定容器中的图像(GTK 菜鸟)

Python GTK update an image in a Fixed container (noob at GTK)

我已经尝试了很多,但总是失败。对于具有 GUI 经验的人来说,这将非常容易。请给出一些示例或重构我的代码。

我正在尝试创建类似于 Conky 的东西(现在不是一个选项)。全屏 window 在桌面上显示文本和图像等信息。我需要有关 gtk 脚本框架的帮助。我希望能够显示磁盘中的多个图像(在自定义位置),每 10 分钟更新一次,以及文件或命令中的文本。

现在我有这个:

#!/usr/bin/python


import gtk
import sys
import cairo



def transparent_expose(widget, event):
    """ Make the given widget transparent. """
    cr = widget.window.cairo_create()
    cr.set_operator(cairo.OPERATOR_CLEAR)
    region = gtk.gdk.region_rectangle(event.area)
    cr.region(region)
    cr.fill()
    return False


class PyApp(gtk.Window):

def __init__(self):
    super(PyApp, self).__init__()

    self.set_title("Fixed")
    self.set_size_request(1300, 280)
    self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
    self.set_position(gtk.WIN_POS_CENTER)

    screen = self.get_screen()
    rgba = screen.get_rgba_colormap()
    self.set_colormap(rgba)
    self.set_app_paintable(True)
    self.connect("expose-event", transparent_expose)


def wetherchart(self):
    try:
        self.thessaloniki = gtk.gdk.pixbuf_new_from_file("/dev/shm/WEATHER/Thessaloniki.comb.png")
    except Exception, e:
        self.thessaloniki = gtk.gdk.pixbuf_new_from_file("/home/athan/LOGs/wait.svg")

    try:
        self.katerini = gtk.gdk.pixbuf_new_from_file("/dev/shm/WEATHER/Katerini.comb.png")
    except Exception, e:
        self.katerini = gtk.gdk.pixbuf_new_from_file("/home/athan/LOGs/wait.svg")

    try:
        self.florina = gtk.gdk.pixbuf_new_from_file("/dev/shm/WEATHER/Florina.comb.png")
    except Exception, e:
        self.florina = gtk.gdk.pixbuf_new_from_file("/home/athan/LOGs/wait.svg")


    self.thessaloniki = self.thessaloniki.scale_simple(505,240,gtk.gdk.INTERP_BILINEAR)
    self.katerini = self.katerini.scale_simple(505,240,gtk.gdk.INTERP_BILINEAR)
    self.florina = self.florina.scale_simple(505,240,gtk.gdk.INTERP_BILINEAR)

    image1 = gtk.Image()
    image2 = gtk.Image()
    image3 = gtk.Image()

    image1.set_from_pixbuf(self.thessaloniki)
    image2.set_from_pixbuf(self.katerini)
    image3.set_from_pixbuf(self.florina)

    fix = gtk.Fixed()

    fix.put(image1, 515, 3)
    fix.put(image2, 1025, 3)
    fix.put(image3, 5, 3)

    self.add(fix)

    self.connect("destroy", gtk.main_quit)
    self.show_all()

PyApp()
#gtk.main()


def main():
    gtk.main()
    return 0

if __name__ == "__main__":
    app = PyApp()
    app.wetherchart()


    #~ 
    #~ backups=Backups()
    #~ gtk.timeout_add( 15* 1000, backups.update)
#~ 
    #~ calendar=Calendar()
    #~ gtk.timeout_add( 1 * 1000, calendar.update)
#~ 
    #~ disks=Disks()
    #~ gtk.timeout_add( 5 * 60 * 1000 , disks.update)
#~ 
    #~ events=Events()
    #~ gtk.timeout_add( 10 * 1000 , events.update)
#~ 
    #~ process = Process()
    #~ gtk.timeout_add( int(0.5 * 1000), process.update)
#~ 
    #~ running = Running()
    #~ gtk.timeout_add( 60 * 1000, running.update)
#~ 
    #~ temps = Temps()
    #~ gtk.timeout_add( int(2 * 1000), temps.update)
#~ 
    #~ transmision = Transmision()
    #~ gtk.timeout_add( int(1 * 1000), transmision.update)

    main()

它运行正常,但我没能让它刷新图像。 我将欣赏用于放置和刷新多个图像和文本标签的通用解决方案。

感谢您的帮助!

我失败了,因为我从更新函数中省略了 return True!!!

这是一个工作示例

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import pygtk
import gtk
from datetime import datetime

class Base:

    def one(self):
        try:
            katerini = gtk.gdk.pixbuf_new_from_file("/dev/shm/WEATHER/Katerini.comb.png")
        except Exception, e:
            katerini = gtk.gdk.pixbuf_new_from_file("/home/athan/LOGs/wait.svg")
        katerini = katerini.scale_simple(505,240,gtk.gdk.INTERP_BILINEAR)

        self.image.set_from_pixbuf( katerini )
        self.label.set_text(str(datetime.now()))
        print "load"
        print datetime.now()
        return True

    def tik(self):
        self.label.set_text(str(datetime.now()))
        return True


    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        #~ #self.window.fullscreen()
        self.window.set_size_request(1300, 280)

        self.image = gtk.Image()
        self.label = gtk.Label()
        self.label.set_text(str(datetime.now()))

        fix = gtk.Fixed()
        gtk.timeout_add( 1000, self.one)

        fix.put(self.image, 5, 3)
        fix.put(self.label, 520, 3)

        #self.window.add(self.image)
        self.window.add(fix)
        self.image.show()
        self.window.show_all()


    def main(self):
        gtk.main()

if __name__ == "__main__":
    print "main"
    Base().main()
    gtk.timeout_add(10, Base.one )

感谢您的帮助!