Stworzyłem aplikację PyGTK, która wyświetla okno dialogowe, gdy użytkownik naciśnie przycisk. Okno jest ładowany w moim sposobie __init__
z:Jak wielokrotnie wyświetlać okno dialogowe za pomocą PyGTK/Gtkbuilder?
builder = gtk.Builder()
builder.add_from_file("filename")
builder.connect_signals(self)
self.myDialog = builder.get_object("dialog_name")
W obsługi zdarzeń, okno jest pokazany z poleceniem self.myDialog.run()
, ale to działa tylko raz, ponieważ po run()
okno jest automatycznie zniszczona. Jeśli kliknę przycisk po raz drugi, aplikacja ulegnie awarii.
Przeczytałem, że istnieje sposób użycia show()
zamiast run()
, gdzie okno dialogowe nie jest zniszczone, ale mam wrażenie, że to nie jest właściwa droga dla mnie, ponieważ chciałbym, żeby dialog zachowywał się modalnie i aby zwracał kontrolę do kod tylko po zamknięciu przez użytkownika.
Czy istnieje prosty sposób wielokrotnego wyświetlania okna dialogowego przy użyciu metody run()
przy użyciu narzędzia gtkbuilder? Próbowałem przeładować całe okno dialogowe za pomocą gtkbuildera, ale tak naprawdę nie działało, w oknie dialogowym brakowało wszystkich elementów potomnych (i wolałbym używać budowniczego tylko raz, na początku programu).
[ROZWIĄZANIE] (edycja)
Jak wskazano w poniższej odpowiedzi, korzystając hide()
załatwia sprawę. Najpierw myślałem, że nadal musisz złapać "usuń-wydarzenie", ale w rzeczywistości nie jest to konieczne. Prosty przykład, że działa to:
import pygtk
import gtk
class DialogTest:
def rundialog(self, widget, data=None):
self.dia.show_all()
result = self.dia.run()
self.dia.hide()
def destroy(self, widget, data=None):
gtk.main_quit()
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("destroy", self.destroy)
self.dia = gtk.Dialog('TEST DIALOG', self.window,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
self.dia.vbox.pack_start(gtk.Label('This is just a Test'))
self.button = gtk.Button("Run Dialog")
self.button.connect("clicked", self.rundialog, None)
self.window.add(self.button)
self.button.show()
self.window.show()
if __name__ == "__main__":
testApp = DialogTest()
gtk.main()
Cóż, dokumentacja nie jest tutaj bardzo jasna. Wydaje się, że sama metoda "run" nie niszczy okna dialogowego, ale jeśli zamkniesz je, naciskając przycisk "zamknij" dostarczony przez menedżera okien (zwykle trochę "X" w prawym górnym rogu okna ", okno dialogowe zostanie zniszczone, jeśli nie przechwycisz "zdarzenia usuwania" – Julian
@Julian, jest odwrotnie - zobacz drugi akapit dokumentacji Okno dialogowe nie zostanie zniszczone nawet po zamknięciu okna – ptomato
Tak, przeczytałem ale jestem nieco zdezorientowany: Jeśli w podanym powyżej przykładzie skomentuję linię 'self.dia.connect (" delete-event ", self.closedialog)' Otrzymuję błąd segmentacji po drugim kliknięciu przycisku.Więc COŚ zostało zniszczone beze mnie, prawda? Dziękuję za wyjaśnienia. – Julian