如何解决导入时,Tkinter计算器程序无法运行
这是我第一次使用StackOverflow,但是我被这个Python计算器程序困住了。
当我独立运行该代码时,它可以很好地工作,但是,如果我将该代码导入另一个也具有Tk()实例的脚本中,则它什么都不做。当我使用打印语句检查按钮时,这些按钮工作正常,我认为条目或StringVar()变量存在问题。 我试图找到解决方案,但找不到与此相关的任何东西。
这是代码:
from tkinter import *
exp=""
def press(num):
global exp
exp=exp + str(num)
equation.set(exp)
def clrscr():
global exp
exp=""
equation.set("")
def equalpress():
try:
global exp
total=str(eval(exp))
equation.set(total)
exp=""
except:
equation.set('ERROR!')
exp=""
win=Tk()
win.title('Calculator')
win.geometry('450x575')
win.configure(bg="#EAF0F1")
win.resizable(width=False,height=False)
equation=StringVar()
equation.set('Enter Value')
disp=Frame(win,width=500,height=100,bg="#dfe4ea")
entry=Entry(disp,width=33,textvariable=equation,font="Roboto 20",bg='#f1f2f6',foreground="#1e272e" )
entry.grid(padx=5,pady=5,ipady=20)
disp.grid(row=0,column=0,sticky="nsew")
btns=Frame(win,height=400,bg="white")
button1 = Button(btns,text=' 1 ',fg='black',bg='red',command=lambda: press(1),height=6,width=12)
button1.grid(row=2,column=0)
button2 = Button(btns,text=' 2 ',command=lambda: press(2),width=12)
button2.grid(row=2,column=2)
button3 = Button(btns,text=' 3 ',command=lambda: press(3),width=12)
button3.grid(row=2,column=4)
button4 = Button(btns,text=' 4 ',command=lambda: press(4),width=12)
button4.grid(row=3,column=0)
button5 = Button(btns,text=' 5 ',command=lambda: press(5),width=12)
button5.grid(row=3,column=2)
button6 = Button(btns,text=' 6 ',command=lambda: press(6),width=12)
button6.grid(row=3,column=4)
button7 = Button(btns,text=' 7 ',command=lambda: press(7),width=12)
button7.grid(row=4,column=0)
button8 = Button(btns,text=' 8 ',command=lambda: press(8),width=12)
button8.grid(row=4,column=2)
button9 = Button(btns,text=' 9 ',command=lambda: press(9),width=12)
button9.grid(row=4,column=4)
button0 = Button(btns,text=' 0 ',command=lambda: press(0),width=12)
button0.grid(row=5,column=0)
plus = Button(btns,text=' + ',command=lambda: press("+"),width=12)
plus.grid(row=2,column=6)
minus = Button(btns,text=' - ',command=lambda: press("-"),width=12)
minus.grid(row=3,column=6)
multiply = Button(btns,text=' * ',command=lambda: press("*"),width=12)
multiply.grid(row=4,column=6)
divide = Button(btns,text=' / ',command=lambda: press("/"),width=12)
divide.grid(row=5,column=6)
equal = Button(btns,text=' = ',command=lambda: equalpress(),width=12)
equal.grid(row=5,column=4)
clear = Button(btns,text='Clear',command=lambda: clrscr(),width=50)
clear.grid(row=6,columnspan=8)
Decimal= Button(btns,text='.',command=lambda: press('.'),width=12)
Decimal.grid(row=5,column=2)
btns.grid(sticky="nsew")
解决方法
尽管允许您拥有多个主/根窗口,但您不应该拥有。 如您所见,它引入了问题。最好有一个主/根。因为这就是治疗方法。
建议使用TopLevel()
作为acw1668。 Effbot's Documentation of TopLevel
否则,问题出在输入,而不是按钮。这些按钮会适当地设置stringvar,但是该条目不会使用该新值进行更新。
提出一种廉价的可怕解决方案
def updateEntry():
entry.delete(0,END)
entry.insert(0,equation.get())
equation.trace_add("write",lambda *_ : updateEntry())
输入后。但是,当您自己运行计算器时,这会增加更多的问题。不要这样拜托。
我不确定其他程序的作用,但是使其成为顶级程序是最好的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。