首页 > 解决方案 > 为什么绕过回调函数

问题描述

我正在尝试开发一个基本的计算器,然后介绍各种功能。

我是 Python 新手,但使用 VB 和 c# 已经有一段时间了。

目前它有一个Entry和三个标签。我在 Entry 中接受来自键盘的输入,并显示在一个标签上。条目被隐藏。

例如 52+56+36+45=189

用户输入 52 并按 + 号

在此阶段“+”显示在一个标签上,52 转移到第二个标签和条目,第一个标签变为空白。

直到这个阶段它才能正常工作。现在在第二步中,当用户输入 56 时,它允许所有键不经任何验证并停止打印输出。这意味着回调函数被绕过。

欢迎任何帮助。

import tkinter

from tkinter import *

def callback(input):
    if input.isdigit() or  "." in input or input == "\b":
        print(input)
        return True
    elif "+" in input :
        print(input)
        svLabelOpr.set("+")
        svLabelDisp.set(svLabel.get())
        svLabel.set("")
        svTxt.set("")
        txt.focus_set()
        return False
    else:
        print(input)
        return False


def oddblue(a,b,c):
    svLabel.set(svTxt.get())

frm=Tk()
frm.geometry("250x250")
svTxt = StringVar()
svLabel = StringVar()
svLabelOpr = StringVar()
svLabelDisp = StringVar()

svTxt.trace('w',oddblue)

txt=Entry(frm, width=10, textvariable=svTxt)
txt.place(x=20, y=20)

reg=frm.register(callback)

txt.config(validate="key", validatecommand=(reg, '%S'))

lbl=Label(frm,anchor='e',width=15,relief=SUNKEN,textvariable=svLabel)
lbl.place(x=50,y=50)

lblOpr=Label(frm,width=3,relief=SUNKEN,textvariable=svLabelOpr)
lblOpr.place(x=180,y=50)

lblDisp=Label(frm,anchor='e', width=15,relief=SUNKEN,textvariable=svLabelDisp)
lblDisp.place(x=50,y=70)

txt.focus_set()

frm.mainloop()

标签: python-3.xtkintercallback

解决方案


添加行:

txt.config(validate="key", validatecommand=(reg, '%S'))

这里:

    elif "+" in input :
        print(input)
        svLabelOpr.set("+")
        svLabelDisp.set(svLabel.get())
        svLabel.set("")
        svTxt.set("")
        txt.focus_set()
        txt.config(validate="key", validatecommand=(reg, '%S')) # <---Here
        return False

也许它由于某些情况而取消注册。再次配置它可以解决它。

另外,我不是 100% 确定你想做什么。但是,如果要添加值,可以替换此行:

svLabelDisp.set(svLabel.get())

用这些:

try:
    svLabelDisp.set(int(svLabelDisp.get())+int(svLabel.get()))
except ValueError:
    svLabelDisp.set(svLabel.get())

推荐阅读