问题描述
当我在MysqL数据库中只有一个学生表时,这4个按钮(插入,删除,更新,获取)可以正常工作。当我尝试在Python GUI中添加学院和学院并运行后,这4个按钮将无法使用。 我在python GUI的每个表下创建了相同的4个按钮。
def insert():
fid = e_fid.get()
fname = e_fname.get();
fsalary = e_fsalary.get();
if(fid=="" or fsalary=="" or fname==""):
MessageBox.showinfo("Insert status","All fields are required")
else:
con = MysqL.connect(host="localhost",user="root",password="",database="test0910")
cursor = con.cursor()
cursor.execute("insert into faculty values('"+ fid + "','"+ fname +"','"+ fsalary +"')")
cursor.execute("commit");
e_fid.delete(0,'end')
e_fname.delete(0,'end')
e_fsalary.delete(0,'end')
show()
MessageBox.showinfo("Insert Status","Inserted Successfully");
con.close();
def insert():
id = e_id.get()
name = e_name.get();
address = e_address.get();
if(id=="" or name=="" or address==""):
MessageBox.showinfo("Insert status",database="test0910")
cursor = con.cursor()
cursor.execute("insert into student values('"+ id + "','"+ name +"','"+ address +"')")
cursor.execute("commit");
e_id.delete(0,'end')
e_name.delete(0,'end')
e_address.delete(0,"Inserted Successfully");
con.close();
root = Tk()
root.geometry("600x700")
root.title("Python+Tkinter+MysqL")
faculty = Label(root,text='Faculty',font=('bold',15))
faculty.place(x=130,y=250);
fid = Label(root,text='Enter ID',10))
fid.place(x=20,y=290);
fname = Label(root,text='Enter Name',10))
fname.place(x=20,y=320);
fsalary = Label(root,text='Enter Salary',10))
fsalary.place(x=20,y=350);
e_fid = Entry()
e_fid.place(x=150,y=290)
e_fname = Entry()
e_fname.place(x=150,y=320)
e_fsalary = Entry()
e_fsalary.place(x=150,y=350)
insert = Button(root,text="Insert",font=("italic",10),bg="white",command=insert)
insert.place(x=40,y=390)
delete = Button(root,text="Delete",command=delete)
delete.place(x=100,y=390)
update = Button(root,text="Update",command=update)
update.place(x=160,y=390)
get = Button(root,text="Get",command=get)
get.place(x=225,y=390)
list = ListBox(root)
list.place(x=360,y=250)
student = Label(root,text='Student',15))
student.place(x=130,y=470);
id = Label(root,10))
id.place(x=20,y=510);
name = Label(root,10))
name.place(x=20,y=540);
address = Label(root,text='Enter Address',10))
address.place(x=20,y=570);
e_id = Entry()
e_id.place(x=150,y=510)
e_name = Entry()
e_name.place(x=150,y=540)
e_address = Entry()
e_address.place(x=150,y=570)
insert = Button(root,y=610)
delete = Button(root,y=610)
update = Button(root,y=610)
get = Button(root,y=610)
list = ListBox(root)
list.place(x=360,y=470)
show()
root.mainloop()
如何为每个表格分开4个按钮?我的Python GUI中共有12个按钮(插入,删除,更新,获取)* 3
我应该使用什么python命令?谢谢!
解决方法
我已经尝试解决了我在代码中发现的大多数问题,但首先让我们关注您的主要问题。理想的使用方式是使用Combobox
,例如:
from tkinter import ttk
from tkinter import messagebox
.....
choices = ['Choose a table','faculty','student'] #list of options to be showed
combo = ttk.Combobox(root,values=choices,state='readonly') #declaring a combobox
combo.current(0) #setting the default value to first item in the list.
combo.pack()
buttoninsert = Button(root,text='Insert',command=insertdb)
buttoninsert.pack()
请注意,在这里,每个功能只需要一个按钮。
然后将insertdb()
定义为:
def insertdb():
if combo.get() == 'Choose a table':
messagebox.showerror('Choose!','Choose an option!')
elif combo.get() == 'faculty':
fid = e_fid.get()
fname = e_fname.get()
fsalary = e_fsalary.get()
if fid=="" or fsalary=="" or fname=="":
messagebox.showinfo("Insert status","All fields are required")
else:
con = mysql.connect(host="localhost",user="root",password="",database="test0910")
cursor = con.cursor()
cursor.execute("insert into faculty values(%s,%s,%s)",(fid,fname,fsalary))
cursor.execute("commit")
e_fid.delete(0,'end')
e_fname.delete(0,'end')
e_fsalary.delete(0,'end')
show()
messageBox.showinfo("Insert Status","Inserted Successfully");
con.close()
elif combo.get() == 'student':
id = e_id.get()
name = e_name.get();
address = e_address.get();
if id=="" or name=="" or address=="":
messageBox.showinfo("Insert status","All fields are required")
else:
con = mysql.connect(host="localhost",database="test0910")
cursor = con.cursor()
cursor.execute("insert into student values(%s,(id,name,address))
cursor.execute("commit");
e_id.delete(0,'end')
e_name.delete(0,'end')
e_address.delete(0,"Inserted Successfully");
con.close()
所以我希望您对发生的事情有一个基本的了解。如果不是这样,它就像用户应该先选择一个选项,然后单击按钮,然后其余的操作就会进行。对代码进行必要的更改,使其适合您的需求。
同样,根据您的目的继续定义其他3个按钮和3个功能。
我做了什么更改?
-
您使用串联将数据插入数据库中,因此这不是一种安全的方法,并且会受到sql注入的影响。因此,我将其更改为参数替换。您将
%s
用作占位符的位置。 Take a look here for better understanding of these -
我注意到您将函数命名为
insert()
,get()
等。这样的命名是不准确的,因为某些tkinter窗口小部件具有insert()
和delete()
方法,因此以后可能会引起python的混乱。 -
避免将变量命名为
list
,id
,因为它们是内置函数,以后会再次引起混乱。 -
我已经导入了
messagebox
,而我注意到您使用了Messagebox
。我不确定tkinter.Messagebox
是否存在,并且可能会引发错误,如果不存在,则可以使用。 -
您可以在列表
choices
中添加更多mysql表名称,它将作为选项出现在Combobox
上。 Check out more on Combobox -
我为什么说
from tkinter import ttk
?这是因为Combobox
是ttk窗口小部件,而不是直接的tkinter窗口小部件,这意味着它已应用了主题(看起来很现代)。
我试图尽可能简单地解释这一点,希望您对如何进行有一个完美的了解。让我知道是否有任何错误或疑问。
欢呼