Python 在PyGTK中使用循环更新cairo文本以进行倒计时

Python 在PyGTK中使用循环更新cairo文本以进行倒计时,python,gtk,pygtk,cairo,Python,Gtk,Pygtk,Cairo,我正试图写一些代码,为摄影棚的现场预览倒计时。我想以前的数字消失时,新的数字是发电机,但为了解决我写的代码,使他们在不同的位置出现,这样我就可以看到发生了什么。不幸的是,只有2个数字打印“4”,我只是作为测试打印,然后实际循环中的第一个数字是“3”,然后没有其他数字打印。我不知道为什么会打印两个数字而不是其余的 倒计时\u计时器=4 计数面积=gtk.DrawingArea() 计数面积。设置应用程序可绘制(真) 固定。放置(计数面积,20,20) def计数器(小部件、事件、计数、pos):

我正试图写一些代码,为摄影棚的现场预览倒计时。我想以前的数字消失时,新的数字是发电机,但为了解决我写的代码,使他们在不同的位置出现,这样我就可以看到发生了什么。不幸的是,只有2个数字打印“4”,我只是作为测试打印,然后实际循环中的第一个数字是“3”,然后没有其他数字打印。我不知道为什么会打印两个数字而不是其余的

倒计时\u计时器=4
计数面积=gtk.DrawingArea()
计数面积。设置应用程序可绘制(真)
固定。放置(计数面积,20,20)
def计数器(小部件、事件、计数、pos):
count\u area=widget.window.cairo\u create()
计数面积。设置源rgb(0.9,0.5,0.9)
计算面积。选择字体面(“Purisa”,cairo.font\u slide\u NORMAL,cairo.font\u WEIGHT\u NORMAL)
计数区域。设置字体大小(25)
计数区域。移动到(30,位置+90)
计数区域。显示文本(计数)
def启动计数器(da):
全局倒计时
倒计时=倒计时
固定连接(“暴露事件”、计数器、str(倒计时)、倒计时*20)
当倒计时>0时:
打印“这是开始计数功能:”,倒计时
倒计时-=1
固定连接(“暴露事件”、计数器、str(倒计时)、倒计时*20)
时间。睡眠(1.0)
如果倒计时=0:
修正。连接(“暴露事件”,计数器,“微笑!”,倒计时*20)
打破

count\u area.show()
在进行UI编程时,不能使用在start\u counter()中执行的睡眠循环。此外,多次连接到公开事件的想法也是错误的


您可以设置一个GLib计时器,该计时器调用一个函数,该函数每秒更新一个倒计时实例变量(请参见
GLib.timeout\u add\u seconds()
)——这使得完全不需要睡眠循环。然后在expose事件处理程序中读取倒计时实例变量并绘制所需内容。

我没有足够的智慧来考虑如何使用cairo实现所需内容,因此我决定只使用标签。我将函数保留在程序的主循环中,这可能是我不应该拥有的,但它似乎可以工作。我使用gobject.timeout\u add代替线程

#以秒为单位设置倒计时时间
倒计时计时器=4
已单击def倒计时(自身、发件人):
全局倒计时
计数器=倒计时计时器
当计数器>=0时:
gobject.timeout\u add(计数器*1000、倒计时功能、倒计时计数器)
计数器-=1
def倒计时功能(计数器):
如果计数器>0:
固定。标签。设置_文本(str(计数器))
其他:
固定.label.set_文本(“:”)
self.photo_cb()
startB_image=gtk.image_new_from_stock(gtk.stock_YES,gtk.ICON_SIZE_SMALL_工具栏)
startB=gtk.Button()
startB.set_映像(startB_映像)
startB.set_工具提示_文本(“开始倒计时”)
startB.connect('clicked',倒计时\u clicked,None)
固定标签=gtk标签(“Z”)
固定.label.modify_字体(pango.FontDescription(“sans 48”))
固定.label.modify_文本(gtk.STATE_NORMAL,gtk.gdk.color_parse(“#00FF00”))
#固定.label.modify_字体(gtk.STATE_NORMAL,gtk.gdk.color_parse(“#00FF00”))
fixed.add(fixed.label)

修复了.show()
GLib超时是否正确
gtk_widget_queue_draw()
将对widget进行排队以重新绘制,此时您可以绘制新文本。至于字体和颜色的调整,您不想使用GtkWidget的
modify.***
功能。相反,要更改字体,请将
attributes
字段设置为包含所需样式的pangoatrtrlist(我认为您需要自定义颜色CSS;请参阅GtkStyleContext)。对不起,我现在不记得全部细节。