2017-06-18 49 views
0

我希望这个脚本不起作用:GTK3和Python:为什么set_property延迟?

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,它的标签没有改变,但“你好”被打印出来。这只发生在3秒钟之后:标签变成“TEST”并且“你”被打印。当函数fnButton1()完成时,似乎属性发生了变化,而不是在那之前。为什么?而且如何解决这个问题?

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

+0

可能重复的[Gtk小部件显示与延迟](https://stackoverflow.com/questions/24272293/gtk-widget-shows-up-with-delay) –

回答

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或块的任何功能事件循环在诸如大多数图形窗口系统的事件驱动系统中是一个坏主意。