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 )
感谢您的帮助!
我已经尝试了很多,但总是失败。对于具有 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 )
感谢您的帮助!