其他分享
首页 > 其他分享> > 在GTK中创建离散值范围小部件的正式方法吗?

在GTK中创建离散值范围小部件的正式方法吗?

作者:互联网

从我可以看到,任何基于Range的小部件的行为都是由Adjustements定义的.

由于似乎没有正式的方法将范围限制为几个离散值,因此我尝试了许多方法来实际重置这些值.

可行但不是最佳的方法是简单地获取当前值并确定哪个有效离散值与该连续值最接近,然后使用该值.

但是我想在视觉上将滑块固定在当前位置,直到用户抓住它足够远,然后立即将其值更改为下一个有效值.

我希望用户理解并感到这些是离散值.上面我的工作解决方案存在的问题是,测试该程序的3个用户告诉我,我应该在显示的数字中加上更多数字,以为更改是连续的.

注意:“正式”一词是指“隐藏”选项或adjustments类的子类(如果有的话).如果不是这样,那么可以通过某种有效有效的方法来达到这样的要求(即,对于简单的滑块,不要使用50%的CPU!).特别是,我不是在要求“最终的最佳方法”来做到这一点.

解决方法:

看来您可以覆盖更改值信号:

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

标签:python-3-x,gtk,gtk3,gobject,python
来源: https://codeday.me/bug/20191026/1939020.html