制作条目小部件"禁用"就像在windows calc中一样

时间:2012-08-20 14:45:07

标签: python tkinter tkinter-entry

我在制作Windows Calc的副本时遇到了Entry小部件的问题。

我在windows calc中创建了按钮,我还绑定了键盘1234567890 + - / *%按钮,使其与calc按钮相同。 主要的问题是我希望Entry只存储数字,让用户只输入数字......但是在搜索了很多关于validatecommand的主题并查看了Windows calc之后,我认为validatecommand不是我需要的东西 - 我不是知道如何让它验证用户输入到输入框的每个字符,并在键盘绑定后,当我在输入框中并按“1”写入数字时,它会执行两次,因为键盘事件绑定会插入输入框也是“1”。

因此,我想要做的是使条目小部件像Windows Calc.exe输入框一样工作。 Windows calc输入框不允许您插入任何其他字符然后编号,也不允许您将光标放入输入框..., 它看起来像这样: -entrybox已禁用但它看起来像ENABLED - 通过计算按钮或键盘按钮可以进行数字和操作

我尝试通过在开始时禁用条目小部件来获得此效果,并使所有按钮的功能如下: - 启用条目小部件 - 插入数字(小部件必须处于启用?或正常?(不记得名称)状态,以便您向其插入内容) - 禁用条目小部件

它的工作方式与我想要的一样......但它看起来并不像我想看的那样。是否有可能将Entry小部件禁用bg颜色更改为正常? 或许是否有另一种方式来制作这样的输入盒? :S

1 个答案:

答案 0 :(得分:2)

执行此操作的方法是使用条目小部件的validatecommandvalidate选项。这种情况正是这些功能的用途。

你说你“不知道如何让它验证用户输入到输入框的每个字符”。如果将validate属性设置为"key",则会导致在每次按键时调用validate命令。

不幸的是,这是Tkinter的一个有点未记录的功能,尽管Tk记录得很好。这是一个执行一些非常基本的检查的工作示例:

import Tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        # define a command to be called by the validation code.  %P
        # represents the value of the entry widget if the edit is
        # allowed. We want that passed in to our validation comman so
        # we can validate it. For more information see
        # http://tcl.tk/man/tcl8.5/TkCmd/entry.htm#M7
        vcmd = (self.register(self._validate), '%P')
        e = tk.Entry(self, validate="key", validatecommand=vcmd)
        e.pack()

    def _validate(self, P):
        # accept the empty string, "." or "-." (to make it possible to
        # enter something like "-.1"), or any string that can be
        # converted to a floating point number.
        try:
            if P in (".", "-", "-.", ""):
                return True
            n = float(P)
            return True
        except:
            self.bell()
            return False

app=SampleApp()
app.mainloop()

如果您在此网站上搜索[tkinter] validatecommand,您会发现许多其他示例。