python Tk接口:NameError:全局名称';第1栏和第27栏;没有定义

python Tk接口:NameError:全局名称';第1栏和第27栏;没有定义,python,tkinter,tk,Python,Tkinter,Tk,“下一步”按钮不起作用。当我单击“下一步”按钮时,出现以下错误: from Tkinter import * import MySQLdb def tran() : first= Tk() label1 = Label(first ,text="From") label1.pack() box1=Entry(first ) box1.pack() label2=Label(first ,text="To") label2.pack() box2=Entry(first

“下一步”按钮不起作用。当我单击“下一步”按钮时,出现以下错误:

from Tkinter import *
import MySQLdb

def tran() :
 first= Tk()

 label1 = Label(first ,text="From")
 label1.pack()

 box1=Entry(first )
 box1.pack()

 label2=Label(first ,text="To")
 label2.pack()

 box2=Entry(first )
 box2.pack()

 label3=Label(first ,text="Amt")
 label3.pack()

 box3=Entry(first )
 box3.pack()

 Button1 = Button(first , text="Next", command=func3).pack() 


def func3() :
 conn = MySQLdb.connect (host = "localhost", user = "root", passwd = "natty", db = "dbms")
 cursor=conn.cursor()

 From=int(box1.get().strip())
 To=int(box2.get().strip())
 Amt=int(box3.get().strip())

 cursor.execute ("select bal from account where acc="+str(From)+"")

 a=cursor.fetchone()
 fromval=int(a[0])

 cursor.execute ("select bal from account where acc="+str(To)+"")

 b=cursor.fetchone()
 toval=int(b[0])

 fromval=fromval-Amt
 toval=toval+Amt

 cursor.execute("update account set bal="+str(fromval)+" where acc="+str(From)+"")
 cursor.execute("update account set bal="+str(toval)+" where acc="+str(To)+"")

 cursor.close ()
 conn.close ()

master = Tk()
Button3 = Button(master, text="Transaction", command=tran).pack()
mainloop()
func3中第24行的文件“disp.py” From=int(box1.get().strip()) NameError:未定义全局名称“box1”
我应该将按钮放在func3中吗?box1是在tran()函数中定义的,因此(如错误消息所示)不是全局定义的。

box1是在tran()函数中定义的,因此(如错误消息所示)不是全局定义的。

将代码更改为:

File "disp.py", line 24, in func3 From = int (box1.get().strip()) NameError: global name 'box1' is not defined
我认为这应该行得通。

将代码更改为:

File "disp.py", line 24, in func3 From = int (box1.get().strip()) NameError: global name 'box1' is not defined

我认为应该这样做。

我不知道这是否是一个复制/粘贴问题,但您确实应该用四个空格缩进python代码。这使得缩进错误更容易被发现,这是一个额外的好处。我也不得不替换双换行符。我不知道这是否是一个复制/粘贴问题,但你真的应该用四个空格缩进python代码。这使得缩进错误更容易被发现,这是一个额外的好处。我还必须替换双换行符。如果我必须在func3中声明box1,将其保留在func3()中意味着导致错误的引用现在将指向另一个box1(func3的本地引用)。请看下面关于函数间共享变量的解释:@user1190883 ScottHunter共享的链接很好,可能会帮助您找到需要的地方。更好的方法是将所有这些信息打包到一个类中,在这种情况下,共享信息通过类实例传递,而不需要全局变量。是否必须在func3中声明box1将其声明在func3()中意味着导致错误的引用现在将指向另一个box1(func3的本地引用). 请看下面关于函数间共享变量的解释:@user1190883 ScottHunter共享的链接很好,可能会帮助您找到需要的地方。更好的方法是将所有这些打包到一个类中,在这种情况下,共享信息通过类实例传递,而不需要全局变量。除非函数是在类中定义的,而我们没有理由相信它们是这样的,否则这将不起作用。(这只会引发一个关于未定义
self
的错误)。即使函数是在类中定义的,
self
应该是函数的第一个参数。谢谢@mgilson!我已经相应地更改了代码。@superprograma快速看一眼,这看起来好多了。@mgilson它现在可以正常工作了。…@user1190883如果这个答案对您来说足够好,您应该接受它(),除非函数是在类中定义的,而我们没有理由相信它们是这样的,否则这将不起作用。(这只会引发一个关于未定义
self
的错误)。即使函数是在类中定义的,
self
应该是函数的第一个参数。谢谢@mgilson!我已经相应地更改了代码。@superprograma快速看一眼,这看起来好多了。@mgilson它现在工作正常了。…@user1190883如果这个答案对您来说足够好,您应该接受它()