2016-06-22 3 views
2

Я искал решение, чтобы скрыть диалог gtk сразу после получения ответа. Но теперь я интересно, почему она исчезает, но только если я не щелкайте в поле ввода:Почему 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» диалоговое окно исчезает и после 4 секунд информация печатается. Если я нахожусь в поле ввода, а затем нажмите «ОК», диалог не исчезнет, ​​пока программа не закончится. Почему это так?

редактировать:

Такой же проблема, если я делаю это с основным циклом:

#!/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

Смежные вопросы