2

Python / GladeでGUIアプリケーションを使用していますが、次の問題があります。[バージョン情報]ダイアログを正しく機能させようとしています...ただし、([バージョン情報]ダイアログで)[閉じる]をクリックしてからもう一度開こうとすると、次のように表示されます。

ここに画像の説明を入力してください

つまり、ウィンドウのほんの小さな断片と、機能していない閉じるボタンだけです。これは私のGladeウィンドウのクラスです:

# glade object
class MainWindow(object):
  builder_ = None

  # load main window
  def __init__(self):
    handler = {
      "sigWindowDestroy" : gtk.main_quit,
      "sigShowAbout"     : self.show_about
    }

    projfile = "proj.glade"
    self.builder_ = gtk.Builder()
    self.builder_.add_from_file(projfile)
    self.builder_.connect_signals(handler)
    window = self.builder_.get_object("main_window")
    window.show()

  # show about dialog
  def show_about(self, *args):
    dAbout = self.builder_.get_object("dAbout")
    dAbout.run()
    dAbout.destroy()

そして私の主な機能では:

  # load glade gui
  app = MainWindow()
  gtk.main()

2回目のクリックで、ターミナルウィンドウに次の出力が表示されます(Mac OS Xを使用)。

GtkWarning: gtk_widget_show: assertion `GTK_IS_WIDGET (widget)' failed
  dAbout.run()
GtkWarning: gtk_label_set_markup: assertion `GTK_IS_LABEL (label)' failed
  dAbout.run()

編集:申し訳ありませんが、PyGTKに一般的に慣れていないために再開する必要があります。

私は提案されたshow()/hide()方法の代わりに方法を使用しました。run()/destroy()今、私はこのチュートリアル(を使用すると言ったrun()/destroy())を強調した別のSO投稿をフォローしていて、この動作を確認しています。

まず、閉じるボタンは何もしません。どういうわけか、その動作は事前に定義されていると思いました。次に、コーナーの閉じるボタンでダイアログを閉じると、run()/destroy()上記と同じ動作が得られます。


編集2:以下を追加することで解決:

dAbout.connect("response", lambda d, r: d.hide())
4

2 に答える 2

3

ウィジェットを(ディープ)コピーしようとしないでください。あなたが知っているように、それは機能しません。

代わりにhide()、ダイアログを表示する代わりにdestroy()

于 2012-10-15T13:09:04.293 に答える
1

run()を使用することもできます。destroy()を使用しないでください。run()とhide()を一緒に使うべきではないと考えた理由は何ですか?ウィジェットを破棄すると、ビルドされたことがないかのようにメモリからウィジェットが削除されることを意味します。非表示にすると、後で再利用できますが、ウィンドウは非表示になる前の状態で再表示されるため、ユーザーが行った変更に注意してください。非表示の状態で、コードからウィジェットのプロパティを操作できます。

閉じるボタンの「事前定義された」アクションは、run()によって引き起こされました。ラムダ関数を使用して投稿したソリューションは、run()が実行するソリューションにすぎません。基本的には次のことを行います。

  • DialogWindowの「応答」信号を接続します
  • DialogWindowの「delete-event」シグナルを接続します
  • 新しいGtkメインループを開始してアプリケーションをブロックします
  • ウィジェットを表示する
  • 信号を切断します
  • 応答を返す

後でそれをhide()する必要があり、それを再び実行することができます。

于 2015-07-11T17:27:59.970 に答える