【问题标题】:I m receiving a Type error when i m trying to connect mysql database with tkinter当我尝试将 mysql 数据库与 tkinter 连接时收到类型错误
【发布时间】:2021-09-12 14:35:37
【问题描述】:

我的代码-

import tkinter as tk

import mysql.connector

# SQL CONNECTION
try:
    data = mysql.connector.connect(host="localhost", user="root", password="", database="login cred")
    cursor = data.cursor()
    print("Connection Successful")
except:
    print("Not Successful")

# GUI CREATION
registration_window = tk.Tk()
registration_window.geometry("1000x500")
registration_window.title("Register Yourself")

# TEXT BOX
firstname = tk.Entry(registration_window, show=None)
lastname = tk.Entry(registration_window, show=None)
email = tk.Entry(registration_window, show=None)
password = tk.Entry(registration_window, show="*")


# DATABASE
def insert():
    FirstName = firstname.pack()
    LastName = lastname.pack()
    Email = email.pack()
    Password = password.pack()

    query = "insert into username_password values('" + FirstName + "', '" + LastName + "', '" + Email + "', '" + Password + "')"

    cursor.execute(query)
    data.commit()
    print("Record Saved Successfully")
    cursor.close()
    data.close()


# Buttons-
register = tk.Button(registration_window, text="REGISTER", command=insert())
clear = tk.Button(registration_window, text="Clear", command=registration_window.destroy)

register.pack()
clear.pack()

# Open Window
registration_window.mainloop()

这是我得到的错误-

Traceback(最近一次调用最后一次):文件 “C:\Users\Dell\PycharmProjects\First Project\tkinterdemo.py”,第 42 行, 在 register = tk.Button(registration_window, text="REGISTER", command=insert()) 文件“C:\Users\Dell\PycharmProjects\First Project\tkinterdemo.py",第 32 行,插入 sql = "插入 username_password 值('" + FirstName + "', '" + LastName + "', '" + Email + "', '" + Password + "')" 类型错误: 只能将 str(不是“NoneType”)连接到 str

我该怎么办??

【问题讨论】:

  • 您需要在insert() 中调用firstname.get() 而不是firstname.pack()。其他 Entry 小部件也是如此。
  • 好吧,如果我这样做,我的文本框就会消失
  • 您需要在insert() 之外致电.pack()command=insert() 也应该是 command=insert

标签: python mysql tkinter


【解决方案1】:

这是非常不安全的,因为它允许 sql 注入

使用

try:
    query = "insert into username_password values (%s,%s, %s, %s)"

    cursor.execute(query,(FirstName,LastName,Email,Password))
    data.commit()
    print("Record Saved Successfully")
    cursor.close()
    data.close()    
except mysql.connector.Error as err:
  print("Something went wrong: {}".format(err))

【讨论】:

  • 我试过了,错误已被删除,但现在数据库中没有任何记录??我该怎么办?
  • 添加错误处理,看看是什么问题
  • 当我尝试输入值然后检查 mysql 时,它没有被记录,并且在编译时没有显示任何错误
  • 请显示创建表,也不要在数据库中保存纯文本密码,这样的问题通常是您没有检查正确的数据库
  • 在这样做之后,它显示的 FirstName 不能为 Null 那是因为我们还没有在文本框中输入任何值并且它正在被执行。
【解决方案2】:

您的代码中存在一些问题:

  • Entry 小部件创建后不调用 .pack()
  • insert()函数中调用.pack()而不是.get()
  • 不在 SQL 语句中使用 placeholder 以避免 SQL 注入
  • 使用command=insert() 而不是command=insert。前者会立即执行insert()

以下是修复上述问题的修改代码:

import tkinter as tk
import mysql.connector

# SQL CONNECTION
try:
    data = mysql.connector.connect(host="localhost", user="root", password="", database="login cred")
    cursor = data.cursor()
    print("Connection Successful")
except:
    print("Not Successful")

# GUI CREATION
registration_window = tk.Tk()
registration_window.geometry("1000x500")
registration_window.title("Register Yourself")

# TEXT BOX
firstname = tk.Entry(registration_window, show=None)
lastname = tk.Entry(registration_window, show=None)
email = tk.Entry(registration_window, show=None)
password = tk.Entry(registration_window, show="*")

# call pack() to show the Entry widgets
firstname.pack()
lastname.pack()
email.pack()
password.pack()

# DATABASE
def insert():
    # use .get() instead of .pack()
    FirstName = firstname.get()
    LastName = lastname.get()
    Email = email.get()
    Password = password.get()

    # use placeholders to avoid SQL injection
    query = "insert into username_password values(%s, %s, %s, %s)"

    cursor.execute(query, (FirstName, LastName, Email, Password))
    data.commit()
    print("Record Saved Successfully")
    cursor.close()
    data.close()


# Buttons-
register = tk.Button(registration_window, text="REGISTER", command=insert)  # use command=insert instead of command=insert()
clear = tk.Button(registration_window, text="Clear", command=registration_window.destroy)

register.pack()
clear.pack()

# Open Window
registration_window.mainloop()

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 2016-05-29
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多