从我所看到的,基于Range
的小部件的行为由Adjustements
小部件定义。
由于似乎没有官方方法将范围限制为几个离散值,我尝试了很多方法来实际重置值。
什么有用,但不是最佳,只是取当前值并确定哪个有效离散值离该连续值最近并使用它。
但我想要的是将滑块直观地冻结到当前位置,直到用户将其抓取得足够远,然后立即将其值更改为下一个有效值。
我希望用户理解并感觉这些是离散值。我上面的工作解决方案的问题在于,测试该程序的3个用户告诉我,我应该在我显示的数字中添加更多数字,认为这种变化是连续的。
注意:通过"官方",我指的是"隐藏" Adjustements
类的选项或子类,如果可用的话。如果没有,任何合理有效的方法来实现这样的要求(即不要将50%的CPU用于简单的滑块!)。特别是,我没有问最终的最佳方式"这样做。
答案 0 :(得分:4)
您似乎可以覆盖change-value
信号:
class DiscreteScale(Gtk.Scale):
def __init__(self, values, *args, **kwargs):
super().__init__(*args, **kwargs)
values.sort()
self.values= values
adjustment= self.get_adjustment()
adjustment.set_lower(values[0])
adjustment.set_upper(values[-1])
self.__changed_value_id= self.connect('change-value', self.__change_value)
def __change_value(self, scale, scroll_type, value):
# find the closest valid value
value= self.__closest_value(value)
# emit a new signal with the new value
self.handler_block(self.__changed_value_id)
self.emit('change-value', scroll_type, value)
self.handler_unblock(self.__changed_value_id)
return True #prevent the signal from escalating
def __closest_value(self, value):
return min(self.values, key=lambda v:abs(value-v))
一个小小的演示:
w= Gtk.Window()
s= DiscreteScale([0, 1, 5, 20, 22])
w.add(s)
w.set_size_request(500, 50)
w.connect('delete-event', Gtk.main_quit)
w.show_all()
Gtk.main()
答案 1 :(得分:2)
您没有指定要查找的离散值区间,但 GtkRange(以及 GtkScale)支持舍入:
scale_widget.set_round_digits(1)
scale_widget.set_digits(1)
我怀疑这是许多用户正在寻找的离散值 GtkScale 的解决方案。
https://developer.gnome.org/pygtk/stable/class-gtkrange.html#method-gtkrange--set-round-digits https://developer.gnome.org/gtk3/stable/GtkRange.html#gtk-range-set-round-digits