返回a";无”;将数据从python发送到MySQL后的行
我正在进行我的项目,但我面临着将数据从python传递到MySQL的问题 代码运行良好,没有给我一个错误,但是它在表中插入了“None”!!我不知道错误在哪里返回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
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:下一次当你要花三天时间解决一个问题时,放慢速度,在程序运行时逐个检查变量,问问自己它们是否是应该的。如果不是,继续追踪它们的定义位置,然后找出为什么它们被设置为与你预期不同的值。