Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GTK3和Python:为什么set_属性被延迟?_Python_Gtk3 - Fatal编程技术网

GTK3和Python:为什么set_属性被延迟?

GTK3和Python:为什么set_属性被延迟?,python,gtk3,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.s

此脚本无法按预期工作:

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()
单击按钮1时,其标签不会更改,但会打印“hello”。这只发生在3秒钟过去之前:标签变为“测试”并打印“您”。属性更改似乎是在函数fnButton1()完成时发生的,而不是在此之前。。为什么?如何解决这个问题

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

    def fnButton1(self):
        button1.set_property("label", "TEST")
        print("hello")
        time.sleep(3)
        print("you")
set_属性
创建绘图命令,这些命令排队进入后台进程,并在Gtk的事件循环“有时间”进行迭代时执行。sleep命令有效地阻止事件循环执行3秒钟。但是,print命令会立即执行。您可以看到,在此期间在现有窗口上移动另一个窗口时,该窗口的内容可能也不会更新

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

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

可能的重复