2017-06-18 4 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() 

Button1をクリックすると、そのラベルが変更されていませんが、「こんにちは」に印刷されています。これは、3秒が経過するまでのみ発生します。ラベルは "TEST"になり、 "you"が印刷されます。関数fnButton1()が終了してから、その前にプロパティの変更が行われているようです。なぜですか?どのようにこれを解決することができますか?

ボタンのクリックから始まる一部の機能の開始時に、いくつかのウィジェットプロパティを変更できるようにしたいだけです。これはプログラミングの間は普通ですが、そうではありませんか? GTK3(Pythonを使用する)の動作が異なるのはなぜですか?

+0

[Gtkウィジェットが重複して表示される可能性があります](https://stackoverflow.com/questions/24272293/gtk-widget-showsup-with-delay) –

答えて

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

set_propertyバックグラウンド・プロセスにキューイングされている描画コマンドを作成し、とGTKのイベントループは、それの繰り返しを行うための「時間」を有しているときに実行されます。 sleepコマンドは、イベントループが3秒間実行されないように効果的にブロックします。ただし、印刷コマンドはただちに実行されます。その期間中に別のウィンドウを既存のウィンドウに移動すると、そのウィンドウの内容は更新されない可能性があります。

あなたが本当に必要な場合sleepあなたはsleepまたはブロックの任意の関数を使用して、

一般的に(例えば、GLibのからadd_timeoutのようなもの)のイベントループを遮断することなく、遅らせるには、いくつかの方法のいずれかになりますイベントループは、ほとんどのグラフィックウィンドウシステムなどのイベント駆動型システムでは悪い考えです。

関連する問題