web-dev-qa-db-ja.com

gtk3ウィンドウが正しく再描画されない

シンプルな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()

メインウィンドウ enter image description here

2番目のウィンドウ-トップレベル enter image description here

2番目のウィンドウ-空白 enter image description here

なぜこれが発生し、どうすれば解決できますか?

2
nik90

さて、あなたのコードがすることは、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)
3
xubuntix