繁体   English   中英

Python Tkinter在一个函数中打开多个窗口

[英]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()

您不能有多个带有其自己的mainloopTk对象。

或者,也可以 ,但是,无论哪个当前正在运行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM