Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法访问声明的全局变量_Python_Tkinter_Global Variables_Nameerror - Fatal编程技术网

Python 无法访问声明的全局变量

Python 无法访问声明的全局变量,python,tkinter,global-variables,nameerror,Python,Tkinter,Global Variables,Nameerror,我尝试声明一个存储返回数据库对象的全局变量。但它引发了NameError异常。 尝试将返回的对象声明为全局对象,但未发生任何有用的操作 import tkinter as tk import mysql.connector import tkinter.messagebox # import connect root = tk.Tk() root.title("Login To Database") root.geometry("400x160") root.resizable(width=F

我尝试声明一个存储返回数据库对象的全局变量。但它引发了NameError异常。 尝试将返回的对象声明为全局对象,但未发生任何有用的操作

import tkinter as tk
import mysql.connector
import tkinter.messagebox
# import connect

root = tk.Tk()
root.title("Login To Database")
root.geometry("400x160")
root.resizable(width=False, height=False)

connectFrame = tk.Frame()
connectFrame.pack()

# Defining Functions


def unhidePassword():
    if (checked.get()):
        passwordEntry.configure(show="")
    elif (not checked.get()):
        passwordEntry.configure(show="*")


def createConnection():
    try:
        global db
        db = mysql.connector.connect(
            user=user.get(),
            host=host.get(),
            password=password.get(),
            database=database.get(),
            auth_plugin='mysql_native_password'
        )
        tkinter.messagebox.showinfo(message="Connection Created Successfully")

    except mysql.connector.errors.ProgrammingError:
        tkinter.messagebox.showerror(
            message="Incorrect Data Entered")


# Creating Widgets

# introLabel = tk.Label(connectFrame, text="Connect To Database",
#                      padx = 15, pady = 10, bg = "#42caff")


userName_label = tk.Label(connectFrame, text="User Name: ")
user = tk.StringVar()
userName_entry = tk.Entry(connectFrame, bd=1, width=27, textvariable=user)

hostLabel = tk.Label(connectFrame, text="Host: ")
host = tk.StringVar()
hostEntry = tk.Entry(connectFrame, bd=1, width=27, textvariable=host)


passwordLabel = tk.Label(connectFrame, text="Password: ")
password = tk.StringVar()
passwordEntry = tk.Entry(connectFrame, bd=1, width=27, textvariable=password)
checked = tk.IntVar()  # For checking if check button is checked or not
showPass = tk.Checkbutton(connectFrame, variable=checked,
                          text="Show Password", command=unhidePassword)


dataBaseLabel = tk.Label(connectFrame, text="Database:  ")
database = tk.StringVar()
dataBaseEntry = tk.Entry(connectFrame, bd=1, width=27, textvariable=database)

connectBtn = tk.Button(
    connectFrame, text="Connect To Database", cursor="hand2", bd=0, bg="#0ffcdd", command=lambda: createConnection())
curosr = db.cursor()
curosr.execute("SELECT * FROM visitors")
print(curosr.fetchall())


userName_label.grid(row=0, column=0)
userName_entry.grid(row=0, column=1)

hostLabel.grid(row=1, column=0)
hostEntry.grid(row=1, column=1)

passwordLabel.grid(row=2, column=0)
passwordEntry.grid(row=2, column=1)
passwordEntry.configure(show="*")
showPass.grid(row=2, column=2, ipadx=20)

dataBaseLabel.grid(row=4, column=0)
dataBaseEntry.grid(row=4, column=1)

connectBtn.grid(row=7, column=1, pady=15, ipady=5)


root.mainloop()

尝试将返回的对象声明为全局对象,但仍然显示未定义错误。但是,我的编辑器能够访问方法和属性。有人能解释一下这是什么吗?

要运行脚本,我做了一些更改

  • 将MySQLdb作为mdb导入
  • 导入系统
所以你的脚本看起来像

 import tkinter as tk
import MySQLdb as mdb
import tkinter.messagebox
import sys

root = tk.Tk()
root.title("Login To Database")
root.geometry("400x160")
root.resizable(width=False, height=False)


connectFrame = tk.Frame()
connectFrame.pack()

# Defining Functions


def unhidePassword():
    if (checked.get()):
        passwordEntry.configure(show="")
    elif (not checked.get()):
        passwordEntry.configure(show="*")


def createConnection():
    try:
        global db
        db = mdb.connect(
            user=user.get(),
            host=host.get(),
            password=password.get(),
            database=database.get(),
            auth_plugin='mysql_native_password'
        )
        tkinter.messagebox.showinfo(message="Connection Created Successfully")

    except :
        msg = (sys.exc_info()[1],
                       sys.exc_info()[0],
                       sys.modules[__name__])
        print(msg)
        #tkinter.messagebox.showerror(msg)


# Creating Widgets

# introLabel = tk.Label(connectFrame, text="Connect To Database",
#                      padx = 15, pady = 10, bg = "#42caff")


userName_label = tk.Label(connectFrame, text="User Name: ")
user = tk.StringVar()
userName_entry = tk.Entry(connectFrame, bd=1, width=27, textvariable=user)

hostLabel = tk.Label(connectFrame, text="Host: ")
host = tk.StringVar()
hostEntry = tk.Entry(connectFrame, bd=1, width=27, textvariable=host)


passwordLabel = tk.Label(connectFrame, text="Password: ")
password = tk.StringVar()
passwordEntry = tk.Entry(connectFrame, bd=1, width=27, textvariable=password)
checked = tk.IntVar()  # For checking if check button is checked or not
showPass = tk.Checkbutton(connectFrame, variable=checked,
                          text="Show Password", command=unhidePassword)


dataBaseLabel = tk.Label(connectFrame, text="Database:  ")
database = tk.StringVar()
dataBaseEntry = tk.Entry(connectFrame, bd=1, width=27, textvariable=database)

connectBtn = tk.Button(connectFrame, text="Connect To Database", cursor="hand2", bd=0, bg="#0ffcdd", command=lambda: createConnection())




userName_label.grid(row=0, column=0)
userName_entry.grid(row=0, column=1)

hostLabel.grid(row=1, column=0)
hostEntry.grid(row=1, column=1)

passwordLabel.grid(row=2, column=0)
passwordEntry.grid(row=2, column=1)
passwordEntry.configure(show="*")
showPass.grid(row=2, column=2, ipadx=20)

dataBaseLabel.grid(row=4, column=0)
dataBaseEntry.grid(row=4, column=1)

connectBtn.grid(row=7, column=1, pady=15, ipady=5)


root.mainloop()
因此,当您尝试连接时,您将看到sys报告的此错误

(TypeError("'auth_plugin' is an invalid keyword argument for connect()"), <class 'TypeError'>, <module '__main__' (built-in)>)
脚本应该可以工作


但是,这不是您想要的正确方法。

请添加完整的错误代码。欢迎使用StackOverflow。请按照您创建此帐户时的建议,阅读并遵循帮助文档中的发布指南。适用于这里。在您发布MCVE代码并准确指定问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您指定的问题。您的发布缺少完整的错误消息,并且您发布的代码远远超过了重现问题所需的代码。
 auth_plugin='mysql_native_password'