获取更改值的更改 (GTK.SpinButton)
Get the change on value-changed (GTK.SpinButton)
有没有办法在接收到值更改信号时查看 SpinButton 更改了多少?
我正在尝试实现一组链接的微调按钮,其中一个微调按钮的变化将导致所有微调按钮发生变化。我不希望它们具有相同的值,但具有相同的增量(即在一个 SpinButton 上增加一次将导致在其他 SpinButtons 上增加)。
我似乎想不出任何办法,只能在后台跟踪值(可能由焦点事件或其他事件触发),然后自己计算增量。这几乎是唯一的方法吗?
这样做的唯一方法是按照您所说的计算增量。这里有一个例子:
from gi.repository import Gtk
class Spins(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.connect("destroy", lambda q: Gtk.main_quit())
box=Gtk.VBox()
self.sp1_val=5
self.sp2_val=15
adjustment1 = Gtk.Adjustment(value=self.sp1_val, lower=-10, upper=2500, step_increment=5, page_increment=5, page_size=0)
self.spinbutton1 = Gtk.SpinButton(adjustment=adjustment1)
self.spinbutton1.connect('value-changed', self.on_spinbutton_1_changed)
adjustment2 = Gtk.Adjustment(value=self.sp2_val, lower=-10, upper=2500, step_increment=15, page_increment=5, page_size=0)
self.spinbutton2 = Gtk.SpinButton(adjustment=adjustment2)
self.spinbutton2.connect('value-changed', self.on_spinbutton_2_changed)
box.add(self.spinbutton1)
box.add(self.spinbutton2)
self.add(box)
self.show_all()
def on_spinbutton_1_changed(self, widget, data=None):
current_value=self.spinbutton1.get_value()
delta=(current_value-self.sp1_val)
self.sp1_val=current_value
self.sp2_val+=delta
self.spinbutton2.set_value(self.sp2_val)
def on_spinbutton_2_changed(self, widget, data=None):
current_value=self.spinbutton2.get_value()
delta=(current_value-self.sp2_val)
self.sp2_val=current_value
self.sp1_val+=delta
self.spinbutton1.set_value(self.sp1_val)
spins=Spins()
Gtk.main()
我相信,如果您以任何其他方式进行,您将进入无限循环,并且您将始终达到调整的最大值。为什么?因为 value-changed
信号跟踪值何时被更改,无论是程序还是用户。因此,如果您手动修改 spinbutton1
,则会激活 on_spinbutton_1_changed
,因此它会修改 spinbutton2
,并且会激活 on_spinbutton_2_changed
,从而修改 spinbutton1
。你看到无限循环了吗?这就是为什么你需要存储 self.sp1_val and self.sp2_val
.
有没有办法在接收到值更改信号时查看 SpinButton 更改了多少?
我正在尝试实现一组链接的微调按钮,其中一个微调按钮的变化将导致所有微调按钮发生变化。我不希望它们具有相同的值,但具有相同的增量(即在一个 SpinButton 上增加一次将导致在其他 SpinButtons 上增加)。
我似乎想不出任何办法,只能在后台跟踪值(可能由焦点事件或其他事件触发),然后自己计算增量。这几乎是唯一的方法吗?
这样做的唯一方法是按照您所说的计算增量。这里有一个例子:
from gi.repository import Gtk
class Spins(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.connect("destroy", lambda q: Gtk.main_quit())
box=Gtk.VBox()
self.sp1_val=5
self.sp2_val=15
adjustment1 = Gtk.Adjustment(value=self.sp1_val, lower=-10, upper=2500, step_increment=5, page_increment=5, page_size=0)
self.spinbutton1 = Gtk.SpinButton(adjustment=adjustment1)
self.spinbutton1.connect('value-changed', self.on_spinbutton_1_changed)
adjustment2 = Gtk.Adjustment(value=self.sp2_val, lower=-10, upper=2500, step_increment=15, page_increment=5, page_size=0)
self.spinbutton2 = Gtk.SpinButton(adjustment=adjustment2)
self.spinbutton2.connect('value-changed', self.on_spinbutton_2_changed)
box.add(self.spinbutton1)
box.add(self.spinbutton2)
self.add(box)
self.show_all()
def on_spinbutton_1_changed(self, widget, data=None):
current_value=self.spinbutton1.get_value()
delta=(current_value-self.sp1_val)
self.sp1_val=current_value
self.sp2_val+=delta
self.spinbutton2.set_value(self.sp2_val)
def on_spinbutton_2_changed(self, widget, data=None):
current_value=self.spinbutton2.get_value()
delta=(current_value-self.sp2_val)
self.sp2_val=current_value
self.sp1_val+=delta
self.spinbutton1.set_value(self.sp1_val)
spins=Spins()
Gtk.main()
我相信,如果您以任何其他方式进行,您将进入无限循环,并且您将始终达到调整的最大值。为什么?因为 value-changed
信号跟踪值何时被更改,无论是程序还是用户。因此,如果您手动修改 spinbutton1
,则会激活 on_spinbutton_1_changed
,因此它会修改 spinbutton2
,并且会激活 on_spinbutton_2_changed
,从而修改 spinbutton1
。你看到无限循环了吗?这就是为什么你需要存储 self.sp1_val and self.sp2_val
.