创建一个只接受数字的pygtk文本框

3 投票
3 回答
5903 浏览
提问于 2025-04-15 22:06

有没有人知道怎么用PyGTK创建一个只接受数字的文本框?我正在用Glade来搭建我的用户界面。

谢谢!

3 个回答

0

把你的文本转换成数字,如果转换失败,就处理这个错误,把文本设置为空字符串。

你可以把这个方法通用化,按照你想要的方式去匹配一个规则表达式。

try:
    val = float(entry.get_text())
    entry.set_text(str(val))
except ValueError:
    entry.set_text('')
4

如果你不想对用户输入的数据进行清理,那就干脆不要让用户输入文本。如果你想收集小时和分钟,可以考虑使用旋转按钮或者其他控件,这样可以限制用户的选择。

你可以看看旋转按钮的例子:http://www.pygtk.org/pygtk2tutorial/examples/spinbutton.py

8

我不知道有没有简单的设置可以做到这一点,我想你需要通过信号来处理这个问题。一个方法是连接到 changed 信号,然后过滤掉不是数字的内容。

简单的方法(虽然没测试过,但应该能用):

class NumberEntry(gtk.Entry):
    def __init__(self):
        gtk.Entry.__init__(self)
        self.connect('changed', self.on_changed)

    def on_changed(self, *args):
        text = self.get_text().strip()
        self.set_text(''.join([i for i in text if i in '0123456789']))

如果你想要格式化的数字,当然可以用更复杂的方法,比如正则表达式,来决定哪些字符可以留在输入框里。

编辑
因为你可能不想在Python中创建你的输入框,我将给你展示一个简单的方法来“数字化”一个已经存在的输入框。

    def numbify(widget):
        def filter_numbers(entry, *args):
            text = entry.get_text().strip()
            entry.set_text(''.join([i for i in text if i in '0123456789']))

        widget.connect('changed', filter_numbers)

    # Use gtk.Builder rather than glade, you'll need to change the format of your .glade file in Glade accordingly
    builder = gtk.Builder()
    builder.add_from_file('yourprogram.glade')
    entry = builder.get_object('yourentry')

    numbify(entry)

撰写回答