返回a";无”;将数据从python发送到MySQL后的行

返回a";无”;将数据从python发送到MySQL后的行,python,mysql,tkinter,Python,Mysql,Tkinter,我正在进行我的项目,但我面临着将数据从python传递到MySQL的问题 代码运行良好,没有给我一个错误,但是它在表中插入了“None”!!我不知道错误在哪里 def report_proble(): top=Toplevel() top.title('Report problem window') name = Label(top, text = "Name:",bg='#BFD5ED').place(x = 300,y = 50) email = Label(top, text = "Ema

我正在进行我的项目,但我面临着将数据从python传递到MySQL的问题 代码运行良好,没有给我一个错误,但是它在表中插入了“None”!!我不知道错误在哪里

def report_proble():
top=Toplevel()
top.title('Report problem window')
name = Label(top, text = "Name:",bg='#BFD5ED').place(x = 300,y = 50)
email = Label(top, text = "Email:",bg='#BFD5ED').place(x = 300, y = 90) 
problem=Label(top, text = "Report your problem:",bg='#BFD5ED').place(x = 300, y = 130)
e1 = Entry(top).place(x = 340, y = 50)
e2 = Entry(top).place(x = 340, y = 90)
Text1=tk.Text(top, height=10,width=50).place(x=300,y=170)

bmitbtn = Button(top, text = "Submit",activebackground = '#3C919D', activeforeground = "blue",command=lambda:db(name,email,problem)).place(x=450,y=340)

def db(name,email,problem)
if(name=="" or email=="" or problem==""):
    MessageBox.showinfo("Insert Status","All fields are required")
else:
    mycursor.execute ("INSERT INTO problem(name,email,problem) values('%s','%s','%s')"%(name,email,problem))
    mycursor.close()
    mydb.commit()

    MessageBox.showinfo("Thank you for the feedback!")
    mydb.close()
MySQL中的表是

姓名、电子邮件、问题

“无”、“无”、“无”

我看不到与数据库的连接,我很确定您可以使用
值(%s,%s,%s)
而是
值('%s','%s','%s')

或者给你一个更好的例子:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  passwd="yourpassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

sql = "INSERT INTO problem (name, email,problem) VALUES (%s, %s,%s)"
val = ("yourdata", "yourdata", "yourdata")
mycursor.execute(sql, val)

mydb.commit()

print(mycursor.rowcount, "record inserted.")
您的代码已编辑:

def report_proble():
top=Toplevel()
top.title('Report problem window')
name = Label(top, text = "Name:",bg='#BFD5ED').place(x = 300,y = 50)
email = Label(top, text = "Email:",bg='#BFD5ED').place(x = 300, y = 90) 
problem=Label(top, text = "Report your problem:",bg='#BFD5ED').place(x = 300, y = 130)
e1 = Entry(top).place(x = 340, y = 50)
e2 = Entry(top).place(x = 340, y = 90)
Text1=tk.Text(top, height=10,width=50).place(x=300,y=170)

bmitbtn = Button(top, text = "Submit",activebackground = '#3C919D', activeforeground = "blue",command=lambda:db(name,email,problem)).place(x=450,y=340)

def db(name,email,problem)
if(name=="" or email=="" or problem==""):
    MessageBox.showinfo("Insert Status","All fields are required")
else:
    sql = "INSERT INTO problem (name, email,problem) VALUES (%s, %s,%s)"
    val = (name, email, problem)
    mycursor.execute(sql, val)

    mydb.commit()

    MessageBox.showinfo("Thank you for the feedback!")
    mydb.close()
更新:

val=(姓名、电子邮件、问题)
更改为
val=(e1、e2、text1)

因为您在此处收集的数据不是姓名、电子邮件或问题。

让我们看看以下代码:

name = Label(...).place(...)
email = Label(...).place(...)
problem=Label(...).place(...)
这是将
名称
电子邮件
问题
全部设置为
。这是因为在python中,
x=y().z()
x
设置为
z
。由于
.place(…)
始终返回
None
,因此您的变量被设置为
None

因此,正因为如此:

bmitbtn = Button(..., command=lambda:db(name,email,problem))....
。。。您总是将
None,None,None
传递给函数

作为最佳实践,您不应在创建小部件的同一行调用
pack
place
、或
grid
。这是一个坏习惯,会导致这样的错误

如果希望
名称
电子邮件
问题
作为小部件的引用,则需要将小部件创建与小部件布局分开:

name = Label(...)
email = Label(...)
problem=Label(...)

name.place(...)
email.place(...)
problem.place(...)
现在,让我们看看
db
函数:

def db(name,email,problem)
    if(name=="" or email=="" or problem==""):
        MessageBox.showinfo("Insert Status","All fields are required")
这些值永远不会是空字符串。目前,它们总是
None
,因为这就是您要传递的内容。但是,即使
名称
电子邮件
问题
不是
,它们也永远不会是空字符串,因为您试图传递的是小部件引用而不是字符串

尽管如此,将标签传递给函数没有什么意义。用户输入的数据将不在标签中。相反,您需要传入条目和文本小部件,然后在函数中调用
.get()
方法来获取数据:

e1 = Entry(top)
e2 = Entry(top)
text1=tk.Text(top, height=10,width=50)
...
bmitbtn = Button(..., command=lambda:db(e1, e2, text1))
def db(name_entry,email_entry,problem_text):
    name = name_entry.get()
    email = email_entry.get()
    problem = problem_text.get("1.0", "end-1c")
    ...
然后,定义
db
以在使用数据之前获取数据:

e1 = Entry(top)
e2 = Entry(top)
text1=tk.Text(top, height=10,width=50)
...
bmitbtn = Button(..., command=lambda:db(e1, e2, text1))
def db(name_entry,email_entry,problem_text):
    name = name_entry.get()
    email = email_entry.get()
    problem = problem_text.get("1.0", "end-1c")
    ...

感谢您的回答,我实际上编写了连接,它工作正常,我更改了代码,但仍然没有给我MySQL表中的数据!我尝试了许多方法来插入数据,但仍然没有给出任何结果,
部分中需要引号,除非实际值本身已经有引号。字符串替换不是向查询中添加参数的最佳方法,部分原因正是如此。您将数据放在e1、e2和text1中?非常感谢您的回答,这对我帮助很大!!但是我在get()“AttributeError:“NoneType”对象没有属性“get”@Albandry:是的,如果你不听从我的建议,你会得到这个错误。这意味着你在代码中的某个地方做了
x。get()
,而
x
被设置为无。在tkinter程序中,这几乎总是意味着你做了
x=SomeWidget(…).place(…)
(或
.grid…
.pack…
),这会导致
x
。我听从你的建议,它终于起作用了!!再次感谢你从3天起我就面临这个问题,你救了我的命,兄弟,我真的很感谢你的帮助:)@Albandry:下一次当你要花三天时间解决一个问题时,放慢速度,在程序运行时逐个检查变量,问问自己它们是否是应该的。如果不是,继续追踪它们的定义位置,然后找出为什么它们被设置为与你预期不同的值。