シンプルなGTK3アプリケーションを作成しています。メイントップレベルウィンドウには、別のトップレベルgtk3ウィンドウを表示するsearchボタンがあります。 2番目のgtk3ウィンドウの(タイトルバーの近くにある)閉じるボタンをクリックすると、期待どおりに閉じます。しかし、検索ボタンをもう一度クリックすると、2番目のトップレベルウィンドウがすべてのウィジェットで再描画されません。代わりに、空のように見えます。
一方、閉じるボタン(下部にあるgtkボタン)をクリックすると、正しく閉じます。そして、再操作すると、すべてのウィジェットを見ることができます。
Info:Gladeを使用してUIを作成しました。
コードを以下に示します。ただし、UIファイルを取得するには、パッケージをダウンロードする必要があります。 ダウンロードできます ここ
#! /usr/bin/env python
from gi.repository import Gtk
import os,sys
UI_FILE = "main.ui"
SECOND_UI_FILE = "second.ui"
class SampleApp:
def __init__(self):
self.builder = Gtk.Builder()
self.builder.add_from_file(UI_FILE)
self.builder.connect_signals(self)
self.builder2 = Gtk.Builder()
self.builder2.add_from_file(SECOND_UI_FILE)
self.builder2.connect_signals(self)
self.window = self.builder.get_object('window')
self.window.set_position(Gtk.WindowPosition.CENTER)
self.window.connect("destroy", self.destroy)
self.window.show_all()
self.search = self.builder.get_object('button1')
self.search.connect("clicked", self.search_clicked)
def destroy(self, window):
Gtk.main_quit()
def search_clicked(self, window):
self.secondwindow = self.builder2.get_object('window1')
self.secondwindow.show_all()
def main():
app = SampleApp()
Gtk.main()
if __name__ == "__main__":
main()
メインウィンドウ
2番目のウィンドウ-トップレベル
2番目のウィンドウ-空白
なぜこれが発生し、どうすれば解決できますか?
さて、あなたのコードがすることは、2番目のウィンドウを破壊させることです。その後それはなくなった。
init
メソッドの最後に次の2行を追加することで、ウィンドウが破壊されないようにする(そして非表示にする)ことができます。
secondwindow = self.builder2.get_object('window1')
secondwindow.connect('delete-event', lambda w, e: w.hide() or True)
これは削除イベントを置き換えます( ドキュメントはこちら )。
または、search_clicked
メソッドの先頭にこれらの行を配置することにより、ウィンドウを開くたびにウィンドウを再作成できます。
self.builder2 = Gtk.Builder()
self.builder2.add_from_file(SECOND_UI_FILE)
self.builder2.connect_signals(self)