Python Tkinter:name错误:name';方程';没有定义

Python Tkinter:name错误:name';方程';没有定义,python,tkinter,Python,Tkinter,我有以下代码。我无法按下我创建的任何按钮,因为我有一个错误: name错误:没有在每个按钮上定义名称“等式”。这有什么问题?我是Python新手。我曾尝试将包含等式的这段代码放在不同的位置(类外,main()func中),但这些都不适用于我 从tkinter导入* expression=“” 类计算(框架): 定义初始化(自): super()。\uuuu init\uuuuu() self.UI() def用户界面(自我): 方程=StringVar() 方程组(“0”) 大字体=('Aria

我有以下代码。我无法按下我创建的任何按钮,因为我有一个错误:
name错误:没有在每个按钮上定义名称“等式”。这有什么问题?我是Python新手。我曾尝试将包含等式的这段代码放在不同的位置(类外,main()func中),但这些都不适用于我

从tkinter导入*
expression=“”
类计算(框架):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.UI()
def用户界面(自我):
方程=StringVar()
方程组(“0”)
大字体=('Arial',30)
自我管理硕士头衔(“Kalkulator”)
self.pack(填充=两者,扩展=1)
calc_txt=条目(宽度=204,字体=大字体,bg=“灰色”,fg=“白色”,textvariable=公式)
计算位置(x=0,y=0)
百分比=按钮(宽度=6,高度=2,text=“%”,bg=“橙色”,fg=“白色”,borderwidth=2,relief=“实心”,命令=lambda:按(“%”)
百分比(x=0,y=49)
sqr_btn=按钮(宽度=6,高度=2,文本=“^”,bg=“橙色”,fg=“白色”,边框宽度=2,浮雕=“实心”,命令=lambda:按(“**”)
广场(x=51,y=49)
sqr_root_btn=按钮(宽度=6,高度=2,文本=”,bg=“橙色”,fg=“白色”,边框宽度=2,浮雕=“实心”,命令=lambda:按(3))
sqr\u根位置(x=102,y=49)
multiply_btn=按钮(宽度=6,高度=2,text=“*”,bg=“橙色”,fg=“白色”,borderwidth=2,relief=“实心”,命令=lambda:按(“*”)
乘法(x=153,y=49)
divide_btn=按钮(宽度=6,高度=2,text=“/”,bg=“橙色”,fg=“白色”,borderwidth=2,relief=“实心”,命令=lambda:按(“/”)
划分位置(x=153,y=89)
添加按钮(宽度=6,高度=2,text=“+”,bg=“橙色”,fg=“白色”,borderwidth=2,relief=“实心”,命令=lambda:按(“+”)
添加位置(x=153,y=129)
substrct_btn=按钮(宽度=6,高度=2,文本=“-”,bg=“橙色”,fg=“白色”,边框宽度=2,relief=“实心”,命令=lambda:按(“-”)
子循环位置(x=153,y=169)
相等按钮(宽度=6,高度=2,text=“=”,bg=“橙色”,fg=“白色”,borderwidth=2,relief=“实心”,command=equalpress)
相等位置(x=153,y=209)
清除按钮(宽度=6,高度=2,text=“C”,bg=“red”,fg=“white”,borderwidth=2,relief=“solid”,command=clear)
清除位置(x=0,y=209)
dot_btn=按钮(宽度=6,高度=2,文本=“.”,bg=“白色”,fg=“黑色”,边框宽度=2,浮雕=“实心”,命令=lambda:按(“.”)
点位(x=51,y=209)
zero_btn=按钮(宽度=6,高度=2,text=“0”,bg=“white”,fg=“black”,borderwidth=2,relief=“solid”,命令=lambda:按(0))
零位(x=102,y=209)
一个按钮(宽度=6,高度=2,text=“1”,bg=“白色”,fg=“黑色”,borderwidth=2,relief=“实心”,命令=lambda:press(1))
一个位置(x=0,y=169)
两个按钮(宽度=6,高度=2,text=“2”,bg=“白色”,fg=“黑色”,borderwidth=2,relief=“实心”,命令=lambda:press(2))
两个位置(x=51,y=169)
三个按钮(宽度=6,高度=2,text=“3”,bg=“白色”,fg=“黑色”,borderwidth=2,relief=“实心”,命令=lambda:press(3))
三个位置(x=102,y=169)
四个按钮(宽度=6,高度=2,text=“4”,bg=“白色”,fg=“黑色”,borderwidth=2,relief=“实心”,命令=lambda:press(4))
四位(x=0,y=129)
五个按钮(宽度=6,高度=2,text=“5”,bg=“白色”,fg=“黑色”,borderwidth=2,relief=“实心”,命令=lambda:press(5))
五位(x=51,y=129)
六个按钮(宽度=6,高度=2,text=“6”,bg=“白色”,fg=“黑色”,borderwidth=2,relief=“实心”,命令=lambda:press(6))
六位(x=102,y=129)
七个按钮(宽度=6,高度=2,text=“7”,bg=“白色”,fg=“黑色”,borderwidth=2,relief=“实心”,命令=lambda:press(7))
七位(x=0,y=89)
八个按钮(宽度=6,高度=2,text=“8”,bg=“白色”,fg=“黑色”,borderwidth=2,relief=“实心”,命令=lambda:press(8))
八位(x=51,y=89)
nine_btn=按钮(宽度=6,高度=2,text=“9”,bg=“white”,fg=“black”,borderwidth=2,relief=“solid”,命令=lambda:press(9))
九位(x=102,y=89)
def压力(数值):
全局表达式
expression=expression+str(num)
方程组(表达式)
def equalpress():
尝试:
全局表达式
总计=str(评估(表达式))
方程组(总)
expression=“”
除:
方程组(“误差”)
expression=“”
def clear():
全局表达式
expression=“”
方程组(“”)
def main():
window=Tk()
窗口。可调整大小(0,0)
窗口几何(“204x250”)
app=Calc()
window.mainloop()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

您需要在类中包含表达式变量和所有函数,然后为所有希望成为“全局”变量的变量指定一个以
self开头的名称。
。像这样:

from tkinter import *

class Calc(Frame):
    def __init__(self):
        super().__init__()
        self.UI()

    def UI(self):
        self.equation = StringVar()
        self.equation.set("0")
        self.expression = ''
        large_font = ('Arial', 30)
        calc_txt = Entry(width = 204, font = large_font, bg = "gray", fg = "white", textvariable = self.equation)
        calc_txt.place(x = 0 , y = 0)

        percentage_btn = Button(width = 6, height = 2, text = "%", bg = "orange", fg = "white", borderwidth=2, relief="solid", command = lambda: self.press("%"))
        percentage_btn.place(x = 0, y = 49)

    def press(self, num):
        self.expression = self.expression + str(num)
        self.equation.set(self.expression)

def main():
    window = Tk()
    window.resizable(0,0)
    window.geometry("204x250")
    app = Calc()
    window.mainloop()

公式
仅在
UI
的范围内定义,一旦函数运行该变量就消失了。你必须在其他地方定义它,所以它总是在范围内。你已经用
expression
这样做了,所以我不确定混淆的地方在哪里,除非你没有写那段代码。如果我把所有这些函数(equalpress,press,clear)放在同一个地方,在
expression
所在的地方,我仍然会得到完全相同的错误。小说提供的解决方案解决了我的问题。E