UnboundLocalError:分配前已引用本地变量'name_chk'

问题描述

我已经在Python中使用Tkinter和MysqL创建了银行管理系统。

def deposit_acc_chk():
mycursor.execute("SELECT name FROM bank_master WHERE acno = '"+deposit_entry1.get()+"'")
for x in mycursor:
    name_chk = ''.join(map(str,x))
deposit_chk_entry.delete(0,"end")
deposit_chk_entry.insert(0,name_chk)
deposit_chk_entry["state"] = "disabled"

代码显示存入资金的帐户持有人的姓名。最初运行良好,但随后出现错误

Traceback (most recent call last):
  File "C:\Users\HP\AppData\Local\Programs\Python\python38-32\lib\tkinter\__init__.py",line 1883,in __call__
    return self.func(*args)
  File "C:\Users\HP\Desktop\BMS - GUI v1.1.2.py",line 196,in deposit_acc_chk
    deposit_chk_entry.insert(0,name_chk)
UnboundLocalError: local variable 'name_chk' referenced before assignment

我试图将变量name_chk显式声明为全局变量,甚至尝试引用一些已经回答过的此类问题,但并没有太大帮助。 我的错误仍然没有解决!请帮助我。

P.S。 -我是新来的,如果无法正确描述我的问题,请原谅!

解决方法

您应该

  • 声明行前的name_chk变量(这样,初始化也发生

    deposit_chk_entry.insert(0,name_chk),例如

    import tkinter as tk
    
    root = tk.Tk()
    name_chk = tk.StringVar()
    

  • 呼叫 deposit_acc_chk()函数,此函数结束后与 行deposit_chk_entry.insert(0,name_chk)是为了引起变量的定义 该功能内的name_chk
,

这是因为SQL语句未返回任何记录,因此未创建name_chk

在更新deposit_chk_entry之前,您应检查是否返回了记录:

def deposit_acc_chk():
    mycursor.execute('SELECT name FROM bank_master WHERE acno = %s',(deposit_entry1.get(),))
    rec = mycursor.fetchone()
    if rec:
        deposit_chk_entry['state'] = 'normal'
        deposit_chk_entry.delete(0,'end')
        deposit_chk_entry.insert(0,rec[0])
        deposit_chk_entry['state'] = 'disabled'

或者,如果找不到记录,最好向用户显示一些内容:

def deposit_acc_chk():
    mycursor.execute('SELECT name FROM bank_master WHERE acno = %s',))
    rec = mycursor.fetchone()
    name_chk = rec[0] if rec else '*** No record found ***'
    deposit_chk_entry['state'] = 'normal'
    deposit_chk_entry.delete(0,'end')
    deposit_chk_entry.insert(0,name_chk)
    deposit_chk_entry['state'] = 'disabled'