2016-06-22 10 views
2

レスポンスを受け取った直後に、gtkダイアログを隠すソリューションを探していました。しかし、今、それは消え、なぜ私が疑問に思って、私は入力フィールドにクリックしない場合にのみ:私はちょうど「OK」ダイアログが消え、4秒後に情報が印刷されたキーを押すとなぜエントリにフォーカスがないときにgtk.Dialogが直接消える

import gtk, time 

def get_info(): 
    entry = gtk.Entry() 
    entry.set_text("Hello") 
    dialog = gtk.Dialog(title = "Title", 
         parent = None, 
         flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, 
         buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, 
         gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) 
    dialog.vbox.pack_start(entry) 
    dialog.show_all()  
    response = dialog.run() 
    if response == gtk.RESPONSE_ACCEPT: 
     info = entry.get_text().strip() 
     dialog.destroy() 
     return info 
    else: 
     exit() 

info = get_info() 
time.sleep(4) 
print info 

。 入力欄をクリックして「OK」を押すと、プログラムが終了するまでダイアログが消えません。 これはなぜそうですか?

編集

同じ問題私はメインループでこれを行う場合:

#!/usr/bin/env python 
# -*- coding: utf8 -*- 


import gtk, time 

class EntryTest: 

    def get_info(self): 
     entry = gtk.Entry() 
     entry.set_text("Hello") 
     dialog = gtk.Dialog(title = "Title", 
          parent = None, 
          flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, 
          buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, 
          gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) 
     dialog.vbox.pack_start(entry) 
     dialog.show_all()  
     response = dialog.run() 
     if response == gtk.RESPONSE_ACCEPT: 
      info = entry.get_text().strip() 
      dialog.destroy() 
      return info 
     else: 
      exit() 

    def main(self): 
     gtk.main() 

if __name__ == "__main__": 
    base = EntryTest() 
    info = base.get_info() 
    time.sleep(4) 
    print info 
+0

興味深いもの:ボックスをクリックしてもテキストが強調表示されていれば、すぐにダイアログが*消えてしまいます...私は好奇心で死ぬでしょう。 – zondo

答えて

2

あなたがメインループを実行していません。これは、通常、Gtk +は何もしないことを意味します - ウィンドウは最初に表示されませんでしたが、dialog.run()は、それ自体が短命のmainloopを実行しているので、動作しているように見えます。 dialog.run()出口の後、あなたは本当にmainloopを実行していないので、Gtk +は何もできません。

gtk.main()が動作している実際のアプリケーションでこれを行うと、うまくいくはずです。

例メインループの使用(そのままEntryTestが滞在することができますが、追加のimport glibが必要になります):

def quit(): 
    print "now quitting" 
    gtk.main_quit() 
    return False 

if __name__ == "__main__": 
    base = EntryTest() 
    print base.get_info() 
    glib.timeout_add_seconds (3, quit) 
    gtk.main() 

それはメインループにのみ、その後のダイアログが表示されているときに動作していないが、ことは注目に値します(私が怠け者だったので)。メインループ内でget_info()コードを開始することもできます。 glib.idle_add()しかし、ポイントは同じです:GTK +は通常、実行するメインループを必要とします。

+0

あなたは正しいですが、これは問題ではありませんでした。これは、メインループを使用するときにも発生します。 – oxidworks

+0

メインループでこれが起こる場所でコードを表示できますか? – jku

+0

確かに、主な質問が編集されました。よろしく。 – oxidworks

関連する問題