GTK3和Python:为什么set_property会被延迟?

时间:2017-06-18 21:49:40

标签: python gtk3

此脚本无法正常工作:

import gi
import time
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class GridWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="hi")

        def fnButton1(self):
            button1.set_property("label", "TEST")
            print("hello")
            time.sleep(3)
            print("you")

        grid = Gtk.Grid()

        button1 = Gtk.Button(label="Button 1")
        button1.connect("clicked", fnButton1)
        button2 = Gtk.Button(label="Button 2")

        grid.add(button1)
        grid.attach(button2, 1, 0, 1, 1)
        self.add(grid)

win = GridWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

单击button1时,其标签不会更改,但会打印“hello”。这只发生在3秒钟过去之前:标签变为“TEST”并打印出“you”。当函数fnButton1()完成时,似乎属性发生了变化,而不是之前...为什么?怎么解决这个问题?

我只是希望能够在某个功能的开头更改一些小部件属性,从按钮单击开始。编程时这是正常的,不是吗?为什么GTK3(使用Python)表现不同?

1 个答案:

答案 0 :(得分:1)

    def fnButton1(self):
        button1.set_property("label", "TEST")
        print("hello")
        time.sleep(3)
        print("you")

set_property创建排队到后台进程的绘图命令,并在Gtk的事件循环'有时间'进行迭代时执行。 sleep命令有效地阻止事件循环执行3秒。但是,打印命令会立即执行。您可以看到,在此期间移动现有窗口时,窗口的内容可能也不会更新。

如果你真的需要sleep,你应该寻找几种方法中的一种来延迟而不阻塞事件循环(例如来自GLib的add_timeout)

通常,使用sleep或阻止事件循环的任何函数在事件驱动的系统中都是一个坏主意,例如大多数图形窗口系统。