tkinter/sql全局错误帮助。

我在使用tkinter和MySQL时遇到了另一个障碍。在上一篇文章之后,我现在能够有一个用户登录,当输入用户名和密码时,就可以成功地建立MySQL连接。现在的问题是"游标不是全局的",我不确定如何做到这一点,或者如何纠正这段代码。因此,在登录并从根窗口中单击"下一步"按钮后,我收到错误消息。

选择 | 换行 | 行号
  1. from Tkinter import *
  2. import sys
  3. import MySQLdb
  4.  
  5.  
  6.  
  7. # Toplevel window that opens when "NEXT" button is clicked in "NextWindow" widget
  8. def NewWindow():
  9.     win = Toplevel()
  10.  
  11.     # entry boxes put in a frame, text stored in variables k, l
  12.     ent_frame = Frame(win)
  13.     Label(ent_frame, text="ITEM:").pack(side=LEFT)
  14.     k = Entry(ent_frame, width=15)
  15.     k.pack(side=LEFT)
  16.     Label(ent_frame, text="BRAND:").pack(side=LEFT)
  17.     l = Entry(ent_frame, width=15)
  18.     l.pack(side=LEFT)
  19.     ent_frame.pack()
  20.  
  21.     # using get method for entry boxes above
  22.     def SaveIt():
  23.         m = k.get()
  24.         n = l.get()
  25.         # executing a sql command and inserting m,n
  26.         cursor.execute ("""INSERT INTO info (item, brand) VALUES("%s", "%s")"""% (m,n))
  27.         print "Number of rows inserted: %d" % cursor.rowcount
  28.         conn.close()
  29.  
  30.     Button(win, text="Save",command=SaveIt).pack(side=BOTTOM)
  31.     Button(win, text="Next", command=win.destroy).pack(side=BOTTOM)
  32.  
  33.  
  34. # Toplevel window that opens when "Next" is clicked from root window.
  35. def NextWindow():
  36.     win = Toplevel()
  37.  
  38.     # entry boxes put in a frame, text stored in variables c,d
  39.     ent_frame = Frame(win)
  40.     Label(ent_frame, text="CITY:").pack(side=LEFT)
  41.     c = Entry(ent_frame, width=15)
  42.     c.pack(side=LEFT)
  43.     Label(ent_frame, text="STATE:").pack(side=LEFT)
  44.     d = Entry(ent_frame, width=15)
  45.     d.pack(side=LEFT)
  46.     ent_frame.pack()
  47.  
  48.     # using get method for entry boxes
  49.     def SaveThis():
  50.         h = c.get()
  51.         j = d.get()
  52.         # executing a sql command and inserting h,j
  53.         cursor.execute ("""INSERT INTO info (city, state) VALUES("%s", "%s")"""% (h,j))
  54.         print "Number of rows inserted: %d" % cursor.rowcount
  55.         conn.close()
  56.  
  57.     # Click 'save' run 'SaveThis' and executes sql command. 'Next' opens toplevel
  58.     Button(win, text="Save",command=SaveThis).pack(side=BOTTOM)
  59.     Button(win, text="Next", command=NewWindow).pack(side=BOTTOM)
  60.  
  61.  
  62.  
  63. # Takes text entered in root window of user & pass and enters them in sql connect
  64. def SaveData():
  65.     f = a.get()
  66.     g = b.get()
  67.     try:
  68.       conn = MySQLdb.connect (host = "localhost",
  69.                               user = "%s" % (f),
  70.                               passwd = "%s" % (g),
  71.                               db = "maindb") 
  72.     # error if wrong username or password 
  73.     except MySQLdb.Error, e:
  74.       print "Error %d: %s" % (e.args[0], e.args[1])
  75.       sys.exit (1)
  76.  
  77.       cursor = conn.cursor () 
  78.  
  79. root = Tk()
  80.  
  81. # frame containing 2 entries which will be stored in variables a,b
  82. ent_frame = Frame(root)
  83. Label(ent_frame, text="USERNAME:").pack(side=LEFT)
  84. a = Entry(ent_frame, width=15)
  85. a.pack(side=LEFT)
  86. Label(ent_frame, text="PASSWORD:").pack(side=LEFT)
  87. b = Entry(ent_frame, width=15)
  88. b.pack(side=LEFT)
  89. ent_frame.pack()
  90.  
  91. # Clicking 'login' runs 'SaveData' and passes info into sql and connects with
  92. # username and password.
  93. Button(root, text="Login",command=SaveData).pack(side=BOTTOM)
  94. # opens a toplevel window with more entry fields
  95. Button(root, text="Next", command=NextWindow).pack(side=BOTTOM)
  96.  
  97. mainloop()
  98.  
# 回答1


您可以发布完整的错误消息,包括回溯吗?能不能就这么简单:

选择 | 换行 | 行号
  1. def SaveData():
  2.     global cursor
# 回答2


这样就解决了,谢谢!由于这个错误,我试图在"def SaveIt"和其他地方设置'global'。这是错误的基础:
在SaveIt第22行中,NameError:未定义全局名称'Cursor'

标签: python

添加新评论