ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-26 19:58:55  阅读:183  来源: 互联网

标签:python-3-x gtk gtk3 gobject python


从我可以看到,任何基于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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有