【问题标题】:Python GTK update an image in a Fixed container (noob at GTK)Python GTK 更新固定容器中的图像(GTK 的菜鸟)
【发布时间】:2015-07-19 19:16:43
【问题描述】:

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

我正在尝试创建类似于 Conky 的东西(目前不是一个选项)。用于在桌面上显示文本和图像等信息的全屏窗口。我需要有关 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()

它运行正常,但我没有设法让它刷新图像。 对于放置和刷新多个图像和文本标签的通用解决方案,我将不胜感激。

感谢您的帮助!

【问题讨论】:

  • 我试过这个,我没能成功
  • stackoverflow.com/questions/13938949/… 它的工作!我测试过。希望有帮助
  • “刷新图像”是指“更改图像”吗?如果是这样,您可能希望使用 GtkDrawingArea 甚至 Clutter 来代替 GtkFixed 和 GtkImage...
  • 我的意思是从磁盘重新加载,没有编辑。我挣扎了很多时间,但是面向对象的编码和 GTK 混淆了太多,无法弄清楚这一点。如果有人能给我一个简单的模板...我需要能够在我的桌面上加载图像和标签并以自定义间隔刷新它们。不会成为实际应用程序。

标签: python gtk pygtk


【解决方案1】:

我失败了,因为我在更新函数中省略了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 )

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多