3

おそらくpygtkプログラミングの基本的なものが欠けていますが、信号をたとえばanに接続し、gtk.Entry許可した場合にのみ接続された信号を出力するようにします。

つまりtoggle_signalling、この最小限のコード(インタラクティブな使用のみ)に何かを追加してHello、シグナリングが「許可」されている場合にのみ出力されるようにします。

import gtk

signal_states = ['On', 'Off']
signal_state = True

def reporter_function(*args,**kwargs):
    print "Hello"

def toggle_signaling(widget, **kwargs):
    global signal_state
    signal_state = not signal_state
    widget.set_label(signal_states[signal_state])
    print ['Emit allowed', 'Emit not allowed'][not signal_state]

w = gtk.Window()
e = gtk.Entry()
b = gtk.Button(label=signal_states[signal_state])

hbox = gtk.HBox()
hbox.pack_start(e)
hbox.pack_end(b)

e.connect("changed", reporter_function)
b.connect("clicked", toggle_signaling)
w.add(hbox)
w.show_all()

以前、このような送信信号の状態にブールフラグを設定しました。たとえばself._updating、カスタムウィジェットクラスで、何かを行う前にコールバック関数にこの状態をチェックさせました。それは私が望んでいることではありません。

ウィジェットがシグナルを送信してはならないことをウィジェットに知らせるgtkネイティブの方法が必要です(例のボタンをクリックしたとき)。私はこれを一度行う方法に出くわしたと確信していますが、もう一度それを見つけることに迷っています。

また、完全に明確にするために、ウィジェットを有効にすることを許可する必要があります。

4

1 に答える 1

4

ブールフラグを回避する方法はないと思います。ウィジェットが信号を送信できるかどうかは、追加のアプリケーションロジックであるため、どこかに保持する必要があります。このトピックに関する以前の調査と、非常に正確に記述された機能に基づいて、おそらくPyGTKチュートリアルの第20.1.2章
を探しています。 包括的なサンプルコードをまとめました。ブールインジケータを除いて維持する唯一のものは、接続された信号のです。お気づきかもしれませんが、Gtk3でプログラムされていますが、重要なメソッドと機能はGtk2と3の両方でまったく同じです。
handler_idhandler_blockhandler_unblock

from gi.repository import Gtk

class TestWindow(Gtk.Window):

    def __init__(self, *args, **kwargs):
        Gtk.Window.__init__(self, *args, **kwargs)
        self.connect("destroy", Gtk.main_quit)
        self.is_allowed = True
        self.create_widgets()
        self.show_all()

    def create_widgets(self):
        box = Gtk.HBox()
        self.entry = Gtk.Entry()
        self.handler_id = self.entry.connect("changed", self.on_entry_changed)
        box.pack_start(self.entry, True, True, 0)
        button = Gtk.Button("Toggle")
        button.connect("clicked", self.on_button_clicked)
        box.pack_start(button, True, True, 0)
        self.add(box)

    def on_entry_changed(self, *args):
        print "entry has changed"

    def on_button_clicked(self, *args):
        if self.is_allowed:
            self.entry.handler_block(self.handler_id)
            print "now blocking"
        else:
            self.entry.handler_unblock(self.handler_id)
            print "now unblocking"
        self.is_allowed = not self.is_allowed

TestWindow()
Gtk.main()
于 2012-09-06T22:15:45.230 に答える