ユーザーがボタンを押すとダイアログを表示するPyGTKアプリケーションを作成しました。ダイアログは私の__init__
メソッドにロードされます:
builder = gtk.Builder()
builder.add_from_file("filename")
builder.connect_signals(self)
self.myDialog = builder.get_object("dialog_name")
イベントハンドラーでは、ダイアログはコマンドで表示されますが、ダイアログが自動的に破棄されself.myDialog.run()
た後、これは1回だけ機能します。run()
ボタンをもう一度クリックすると、アプリケーションがクラッシュします。
show()
ダイアログが破棄されない場所の代わりに使用する方法があることを読みましたがrun()
、ダイアログをモーダルに動作させ、ユーザーの後にのみ制御をコードに戻したいので、これは私にとって正しい方法ではないと感じていますそれを閉じました。
run()
gtkbuilderを使用するメソッドを使用してダイアログを繰り返し表示する簡単な方法はありますか?gtkbuilderを使用してダイアログ全体をリロードしようとしましたが、実際には機能していないようで、ダイアログにはすべての子要素がありませんでした(プログラムの開始時に、ビルダーを1回だけ使用する必要があります)。
[解決策](編集)
以下の回答で指摘されているように、を使用hide()
するとトリックが実行されます。「delete-event」をキャッチする必要があると最初は思っていましたが、実際には必要ありません。動作する簡単な例は次のとおりです。
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()