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

时间:2015-02-19 01:59:30

标签: python gtk pygtk cairo

我正在尝试编写一些代码,将倒计时放在照片上的实时预览中。我希望以前的数字在新数字是生成器时消失但是要排除故障我编写了代码以便它们出现在不同的位置,这样我才能看到发生了什么。不幸的是,只有2个数字打印“4”,我只是打印作为测试,然后实际循环中的第一个数字是“3”,然后没有其他打印。我不知道为什么要打印2个数字而不是其他数字。

        countdown_timer = 4

        count_area = gtk.DrawingArea()
        count_area.set_app_paintable(True)
        fixed.put(count_area, 20, 20)


        def counter(widget, event, count, pos):
            count_area = widget.window.cairo_create()
            count_area.set_source_rgb(0.9, 0.5, 0.9)
            count_area.select_font_face("Purisa", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
            count_area.set_font_size(25)
            count_area.move_to(30, pos+90)
            count_area.show_text(count)
              
        def start_counter(da):
            global countdown_timer
            countdown = countdown_timer
            fixed.connect("expose-event", counter, str(countdown), countdown*20)
            while countdown > 0:
                print "This is the start_counter function speaking:", countdown
                countdown -= 1
                fixed.connect("expose-event", counter, str(countdown), countdown*20)
                time.sleep(1.0)
                if countdown == 0:
                    fixed.connect("expose-event", counter, "Smile!", countdown*20)
                    break            

        count_area.show()

非常感谢任何帮助,这是我在这里发表的第一篇文章。循环中的测试打印语句也按预期打印。

2 个答案:

答案 0 :(得分:0)

当您进行UI编程时,不能使用在start_counter()中执行的睡眠循环。另外,多次连接到expose-event的想法是错误的。

您可以设置一个GLib计时器,该计时器每秒调用一个更新倒计时实例变量的函数(参见glib.timeout_add_seconds()) - 这使得完全不需要睡眠循环。然后在expose-event处理程序中,您将读取倒计时实例变量并绘制您想要的内容。

答案 1 :(得分:0)

我不够聪明,无法想象如何将cairo用于我想要的东西,所以我决定只使用标签。我将函数保存在程序的主循环中,我可能不应该这样,但它似乎有效。我没有使用线程,而是使用了gobject.timeout_add

#set the countdown time in seconds
countdown_timer = 4
 
        def countdown_clicked(self, sender):
            global countdown_timer
            counter = countdown_timer
            while counter >= 0:
                gobject.timeout_add(counter * 1000, countdown_function, countdown_timer-counter)
                counter -= 1
    
        def countdown_function(counter):
            if counter > 0:
                fixed.label.set_text(str(counter))
            else:
                fixed.label.set_text(" :)")
                self.photo_cb()
                
                
        startB_image = gtk.image_new_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_SMALL_TOOLBAR)
        startB = gtk.Button()
        startB.set_image(startB_image)
        startB.set_tooltip_text("Start countdown")
        startB.connect('clicked', countdown_clicked, None)                
        
        fixed.label = gtk.Label("Z")     
        fixed.label.modify_font(pango.FontDescription("sans 48"))
        fixed.label.modify_text(gtk.STATE_NORMAL, gtk.gdk.color_parse("#00FF00"))
        #fixed.label.modify_font(gtk.STATE_NORMAL, gtk.gdk.color_parse("#00FF00"))
        fixed.add(fixed.label)  
        fixed.show()        

我无法让标签改变颜色。它保持黑色。