手动切换窗口小部件在pyg中发出信号的能力

2024-05-23 15:15:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我可能在pygtk编程中遗漏了一些基本的东西,但是我想将一个信号连接到例如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原生的方式,让小部件知道它不应该发送信号(当我在示例中单击按钮时)。我很确定我曾经偶然发现过一种方法来做这件事,但我又一次迷失了方向。在

另外,为了绝对清楚,必须仍然允许启用小部件。在


Tags: hellogtksignal信号部件defnotfunction
1条回答
网友
1楼 · 发布于 2024-05-23 15:15:46

我不认为有办法绕过布尔标志。小部件是否允许发出信号是附加的应用程序逻辑,因此必须保存在某处。
根据您之前对该主题的研究以及您最可能正在寻找的chapter 20.1.2 of the PyGTK tutorial功能的非常精确的描述。
我把全面的示例代码放在一起。除了布尔指示符之外,唯一要保留的是连接信号的handler_id。正如您可能注意到的,它是在Gtk3中编程的,但是重要的方法handler_block和{}在gtk2和Gtk3中的作用完全相同。在

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()

相关问题 更多 >