【问题标题】:tkinter entry validation not workingtkinter 条目验证不起作用
【发布时间】:2014-09-19 15:03:45
【问题描述】:

在过去的几个小时里,我一直在努力让输入框验证正常工作,我尝试过使用 'self' 编辑所有内容,就像 Bryan 所做的 here。 即:

self.root = tk.tk()

这给我留下了一个只允许整数的输入框(我只想允许整数)

但是添加类并放置主循环和 'calc = Tk()'(或 self.root = tk.Tk())阻止了我的其他小部件被使用。

所以我提供的是我当前的尝试,它给我抛出了这个错误:

TypeError: OnValidate() 缺少 1 个必需的位置参数:'W' Tkinter 回调异常

任何帮助将不胜感激,我搜索了互联网,但似乎没有关于这种方法的文档,或者我真的不擅长研究。

感谢您抽出宝贵时间阅读我的问题,我期待任何答案。

from tkinter import *
import tkinter as tk
global choice 
choice = 0



def calculate(*event):
    if choice == 1:
        add1 = ccalc1.get()
        add2 = ccalc2.get()
        answ = add1 + add2         
        answer = Label(calc, text = answ)
        answer.grid(row=1, column=0)
    elif choice == 2:
        sub1 = ccalc1.get()
        sub2 = ccalc2.get()
        answ = sub1 - sub2         
        answer = Label(calc, text = answ)
        answer.grid(row=1, column=0)
    elif choice == 3:
        mul1 = ccalc1.get()
        mul2 = ccalc2.get()
        answ = mul1 * mul2         
        answer = Label(calc, text = answ)   
        answer.grid(row=1, column=0)
    elif choice == 4:
        div1 = ccalc1.get()
        div2 = ccalc2.get()
        answ = div1 / div2         
        answer = Label(calc, text = answ)
        answer.grid(row=1, column=0)
def choice1():
    global choice
    choice = 1  
    welcome.config(text="Addition")
def choice2():
    global choice
    choice = 2   
    welcome.config(text="Subtraction")
def choice3():
    global choice
    choice = 3   
    welcome.config(text="Multiplication")
def choice4():
    global choice
    choice = 4   
    welcome.config(text="Division")
tkinter     
def OnValidate(self, d, i, P, s, S, v, V, W):
        return S.isdigit()




calc = Tk()
calc.title("Calculator")
calc.geometry("200x140")





ccalc1 = IntVar()
ccalc2 = IntVar()



if choice == 0:
    welcome = Label(calc, text="Select a choice")
val = (calc.register(OnValidate),
      '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')  
calcbox1 = Entry(calc,textvariable=ccalc1, validate="key", 
                              validatecommand=val)
calcbox2 = Entry(calc,textvariable=ccalc2, validate="key", 
                              validatecommand=val)
submit = Button(calc, text="CALCULATE", command = calculate)

welcome.grid(row=0,column=0)
calcbox1.grid(row=2, column=0)
calcbox2.grid(row=3, column=0)
submit.grid(row=4, column=0)
calc.bind('<Return>', calculate)



menu=Menu(calc)

filemenu = Menu(menu,tearoff=0)
filemenu.add_command(label="Add", command = choice1)
filemenu.add_command(label="Subtract", command = choice2)
filemenu.add_command(label="Multiply", command = choice3)
filemenu.add_command(label="Divide", command = choice4)

menu.add_cascade(label="Operations",menu=filemenu)

help = Menu(menu,tearoff=0)
help.add_command(label="About")

menu.add_cascade(label="Help",menu=help)


calc.config(menu=menu)
calc.app = Frame(calc)
calc.app.grid()
calc.mainloop()  

【问题讨论】:

  • 您没有将适当的self 参数传递给OnValidate(这似乎不是一种方法),因此其他所有内容都向上移动,您似乎缺少@987654325 @.
  • 为了扩展 jon 的评论,拥有一个第一个参数是 self 的函数是没有意义的,除非该函数在一个类中。这是您的代码和 Bryan 的代码之间的区别之一。
  • 那我该如何正确地通过它呢?我尝试了很多方法,但每个人都失败了。我会在哪里错过'W'? val 和 OnValidate 都有 'W'
  • 那么你有什么建议,凯文?我对 Python 很陌生,我只是想学习如何制作一个像样的计算器。虽然我确实扩展了我的想法,但我非常坚持在继续之前学习如何以某种方式制作事物。
  • 从函数定义中删除 self 使其运行而不会引发任何错误,但是 OnValidate 从未真正运行......我对此感到非常惊讶。现在用它四处寻找。

标签: python tkinter


【解决方案1】:

三个问题:

  1. 您在第 49 行有一个 NameError,就在 choice4 函数之后。

        welcome.config(text="Division")
    tkinter      #what's this for?
    def OnValidate(self, d, i, P, s, S, v, V, W):
    

    只需从该行中删除 tkinter。

  2. OnValidate 不应有 self 参数,因为它不是类的一部分。

    def OnValidate(d, i, P, s, S, v, V, W):
    
  3. 一个条目不能同时具有textvariable 和validatecommand。如果你想要一个验证命令,你将不得不在没有 text 变量的情况下做。您现在使用calc1.get() 的所有地方都必须替换为int(calcbox1.get())。

【讨论】:

  • 谢谢你,凯文。我忘记了我可以直接从输入框中获取。名称错误是一个意外放置,我已经从代码中删除了它。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多