[英]Python Tkinter open multiple windows within a function
我的程序中有一个内置计算器。 我的主程序被设计为与Microsoft Bob相似。 现在,当用户在主焦点上按下“计算器”按钮时,它将打开计算器的一部分,您可以在其中定义2个数字和运算符。 当您按“结果”时,直到我的主程序关闭,答案才以任何形式出现。 有什么帮助吗? 随附的是计算器代码示例,并且非常乐意将第二个窗口更改为其他内容。 顺便说一句,这是一个学校项目。
def Calculator():
calculator = Tk()
Number1 = DoubleVar()
Number2 = DoubleVar()
Operator = IntVar()
Operator.set(1)
Entry(calculator,textvariable=Number1,justify="c").grid()
Entry(calculator,textvariable=Number2,justify="c").grid()
Radiobutton(calculator,text="Add",variable=Operator,value=1).grid()
Radiobutton(calculator,text="Subtract",variable=Operator,value=2).grid()
Radiobutton(calculator,text="Multiply",variable=Operator,value=3).grid()
Radiobutton(calculator,text="Divide",variable=Operator,value=4).grid()
Radiobutton(calculator,text="Square",variable=Operator,value=5).grid()
Radiobutton(calculator,text="Square root",variable=Operator,value=6).grid()
Button(calculator,text="results",command=calculator.destroy,width=16).grid()
Number1=Number1.get()
Number2=Number2.get()
Operator=Operator.get()
if Operator==1:Results=Number1+Number2
if Operator==2:Results=Number1-Number2
if Operator==3:Results=Number1*Number2
if Operator==4:Results=Number1/Number2
if Operator==5:Results=math.pow(Number1,Number2)
if Operator==6:Results=Number1*(1/Number2)
Results = "The answer is "+str(Results)
Answer = Tk()
Answer.geometry("150x150")
Label(Answer, text=Results).place(relx=.5,rely=.5,anchor="center")
Answer.mainloop()
您不能有多个带有其自己的mainloop
的Tk
对象。
或者,也可以 ,但是,无论哪个当前正在运行mainloop
,在该mainloop
完成之前,其他任何人(及其子代)都不会做任何事情。
您想要的是拥有多个Toplevel
窗口小部件,它们的主Tk
相同。 (如果您通常只有一个Tk
,则可以将其保留为默认值。)
但是,这里还有另一个同样严重的问题。
您正在创建一个附带一堆Tk变量的Calculator
,然后立即尝试读取这些变量并对它们进行一些处理。 你不能那样做。
您需要做的就是将所有这些内容都放入某种用户事件的回调中,例如单击“ Results
按钮。
您的代码中还有另一个问题,使事情变得有些困难:
Number1=Number1.get()
您真正想要的是两个单独的变量,一个是Tk var,另一个是int。 然后,您需要以某种方式使Tk var在results
回调中可访问。 最明显的方法是将所有这些移到一个类上,并将所有Tk变量存储为实例属性。 如果您不知道该怎么做,可以随时使用全局变量。 (这不是理想的方法,但是在学习课程之前就可以了。)然后,实际的数字仅在回调函数中本地存在。
放在一起:
def Calculator(root):
global Number1, Number2, Operator
calculator = Toplevel()
Number1 = DoubleVar()
Number2 = DoubleVar()
Operator = IntVar()
Operator.set(1)
Entry(calculator,textvariable=Number1,justify="c").grid()
Entry(calculator,textvariable=Number2,justify="c").grid()
Radiobutton(calculator,text="Add",variable=Operator,value=1).grid()
Radiobutton(calculator,text="Subtract",variable=Operator,value=2).grid()
Radiobutton(calculator,text="Multiply",variable=Operator,value=3).grid()
Radiobutton(calculator,text="Divide",variable=Operator,value=4).grid()
Radiobutton(calculator,text="Square",variable=Operator,value=5).grid()
Radiobutton(calculator,text="Square root",variable=Operator,value=6).grid()
Button(calculator,text="results", command=lambda event: calculate(calculator), width=16).grid()
def calculate(calculator):
n1=Number1.get()
n2=Number2.get()
op=Operator.get()
if op==1:Results=n1+n2
if op==2:Results=n1-n2
if op==3:Results=n1*n2
if op==4:Results=n1/n2
if op==5:Results=math.pow(n1,n2)
if op==6:Results=n1*(1/n2)
Results = "The answer is "+str(Results)
calculator.destroy()
Answer = Toplevel()
Answer.geometry("150x150")
Label(Answer, text=Results).place(relx=.5,rely=.5,anchor="center")
root = Tk()
# Presumably your real code has some top-level stuff, where the
# user can ask you to open a calculator, like a button whose
# command calls the Calculator function? But here, we'll just:
Calculator(root)
root.mainloop()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.