gpt4 book ai didi

python - 相互依赖的 PyGtk SpinButton

转载 作者:太空宇宙 更新时间:2023-11-03 19:30:34 27 4
gpt4 key购买 nike

我有三个相互依赖的 PyGTK SpinButton:将它们称为 A、B 和 C。还有另一个按钮 D 在 C 的两个相互定义之间切换,这样 C 的值定义为 A/B 除非 D 被按下奇数次。

例如,我希望能够根据此关系更改 A 并让 B C 立即更新。我还希望能够更改 B 并立即更新 A 或 C。 C 也是如此。我决定,当其中一个发生更改时,应更新最近最少更改的 SpinButton,并且如果自程序开始以来没有更改过 SpinButton,则应假定 C 最近已更改。

以上所有内容均已实现。我的应用程序监听每个 SpinButton 的值更改信号,执行上述计算,然后按所述更新其他两个的值。但是,应用程序会获取自己的更改并对其做出响应。当我更改 A 时,我的程序会更改 B,而 B 是通过更改 C 来处理的,依此类推。我也尝试过更改值信号,但它不响应 SpinButton 的更改。

如何以不被程序本身触发的方式监听 SpinButton 值的变化?

最佳答案

您可以在调用 set_value 之前禁用给定微调器的信号处理程序。这确保了信号仅在响应鼠标和键盘事件时触发,而不是在编程更改时触发。这是一个简单的例子:

import pygtk, gtk
win = gtk.Window(gtk.WINDOW_TOPLEVEL)
win.connect('destroy', lambda w: gtk.main_quit())

def _add_spinner():
adj = gtk.Adjustment(0.0, -100.0, 100.0, 1.0, 2.0, 0.0)
spin = gtk.SpinButton(adj, 0, 1)
spin.set_wrap(True)
hbox.pack_start(spin, True, True, 10)
return spin

vbox = gtk.VBox(True, 10)
hbox = gtk.HBox(True, 10)
vbox.pack_start(hbox, True, True, 10)
spin1 = _add_spinner()
spin2 = _add_spinner()
win.add(vbox)

def set_spin(src, dst):
# ensure that calling `set_value` does not fire events
hid = handlers.get(dst)
dst.handler_block(hid)
dst.set_value(src.get_value() + 1.5)
dst.handler_unblock(hid)

# when 'spinN' is changed, call 'set_spin'
hid1 = spin1.connect('value-changed', set_spin, spin2)
hid2 = spin2.connect('value-changed', set_spin, spin1)
handlers = {spin1: hid1, spin2: hid2}
win.show_all()
gtk.main()

关于python - 相互依赖的 PyGtk SpinButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6104098/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com