python-3.x - 为什么绕过回调函数
问题描述
我正在尝试开发一个基本的计算器,然后介绍各种功能。
我是 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()
解决方案
添加行:
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())
推荐阅读
- javascript - 在 ion-item 中内联显示信息图标
- opencv - OpenCV Cascade Training Fast, Fails: 达到所需的叶子误报率。分行培训终止
- ios - Cannot assign through subscript: subscript is get-only
- nginx - 将whatever.net重定向到whatever.com而不在nginx.conf中明确写“whatever”
- apache-spark - 无法使用 JDBC 写入本地 Hive
- javascript - 如何隐藏 div html?
- scaling - Windows 10 IoT Core change DPI scaling
- ios - How do I pass a value from array for every increment of score
- javascript - Using lifecycle method with redux versus checking prop state in render method
- java - 泛型处理 LinkedHashMap