看來你可以只覆蓋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()
確實[這](https://developer.gnome.org/gtk3/stable/ GtkScale.html#gtk-scale-add-mark)做你需要的嗎?我自己沒有用過,所以我不確定。 – andlabs
嗯,這是一個很好的建議,但它混合了不好的表現和行爲。設想一個範圍從0到100的滑塊,每個整數值都有一個這樣的標記:這會很難看。 – JohnW