6

ダイアログを閉じるボタンと閉じないボタンがあるダイアログ ウィンドウが必要です。これを行う方法は、responseからの信号を使用してダイアログGtk.Dialogを呼び出すことです。emit_stop_by_name('response')(誰かがこれを行うためのより良い方法を知っている場合、それはこの質問の残り全体を先取りする可能性があります。)

これは、PyGTK を使用したときに機能しました。私は今 PyGObject に移行しています..この手法は、を使用するのではなく、手動で応答信号に接続する場合にのみGtk.Builder.connect_signals()機能するようです。

しかし、私の言葉を鵜呑みにしないでください。これが私の問題の最小限の例です:

from gi.repository import Gtk

xml = """<interface>
  <object class="GtkDialog" id="dialog1">
    <signal name="response" handler="on_response"/>
    <child internal-child="vbox">
      <object class="GtkBox" id="dialog-vbox1">
        <child internal-child="action_area">
          <object class="GtkButtonBox" id="dialog-action_area1">
            <child>
              <object class="GtkButton" id="button1">
                <property name="label">Don't Close Dialog</property>
                <property name="visible">True</property>
              </object>
            </child>
            <child>
              <object class="GtkButton" id="button2">
                <property name="label">Close Dialog</property>
                <property name="visible">True</property>
              </object>
            </child>
          </object>
        </child>
      </object>
    </child>
    <action-widgets>
      <action-widget response="0">button1</action-widget>
      <action-widget response="-6">button2</action-widget>
    </action-widgets>
  </object>
</interface>
"""

def on_button_clicked(widget):
    d = DummyDialog()
    d.dialog1.run()
    d.dialog1.destroy()

class DummyDialog:
    def __init__(self):
        self.builder = Gtk.Builder()
        self.builder.add_from_string(xml)
        self.dialog1 = self.builder.get_object('dialog1')
        self.builder.connect_signals(self)

    def on_response(self, widget, response, data=None):
        print 'response:', response
        if response >= 0:
            widget.emit_stop_by_name('response')

w = Gtk.Window()
w.connect('destroy', Gtk.main_quit)
b = Gtk.Button('Open Dialog')
b.connect('clicked', on_button_clicked)
w.add(b)

w.show_all()

Gtk.main()

これを実行すると、ボタンが 1 つだけのウィンドウが表示されます。そのボタンをクリックすると、「ダイアログを閉じない」というラベルの付いた 1 つと「ダイアログを閉じる」というラベルの付いた 2 つのボタンを含むダイアログがポップアップします。上記のコードを実行すると、両方のボタンがダイアログを閉じます。

Gtk.Builder.connect_signals()ただし、使用から手動で信号を接続するように変更した場合は、

        self.builder.connect_signals(self)

        self.dialog1.connect('response', self.on_response)

その後、設計どおりに機能し始めます(「ダイアログを閉じない」ボタンはダイアログを閉じません)。

しかし、これらの 2 つの行は、このコンテキストでは機能的にまったく同じであるべきではないでしょうか? 2 つのシナリオの違いを理解する方法はありますか?

から CLI にテキストがまだ出力されているため、両方の状況で信号がまだ接続されていることがわかりますDummyDialog.on_response。しかし、widget.emit_stop_by_name('response')GtkBuilder を使用すると、一部が機能しなくなったようです。

さらに困惑するのは、この正確なコードを取得して PyGTK ( に変更) で実行すると、両方のシナリオで (またはを使用しfrom gi.repository import Gtkて) 正しく動作することです。import gtk as Gtkself.builder.connect_signals(self)self.dialog1.connect('response', self.on_response)

4

1 に答える 1

2

私はそれを少し違うものにします。dialog1.destroy()ボタンでクリックされたコールバックを削除し、on_responseコールバックを次のように変更します。

    def on_response(self, widget, response, data=None):
        print 'response:', response
        if response < 0:
            self.dialog1.destroy()
于 2012-03-05T16:12:45.020 に答える