谁能告诉我如何用相同的按钮解决 python gui tkinter 但在不同的 MySQL 表中单独工作

Posted

技术标签:

【中文标题】谁能告诉我如何用相同的按钮解决 python gui tkinter 但在不同的 MySQL 表中单独工作【英文标题】:Can anyone show me how to solve the python gui tkinter with same buttons but working separately in different MySQL tables 【发布时间】:2020-12-28 21:56:33 【问题描述】:

当我在 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", "All fields are required")
    else:
        con = mysql.connect(host="localhost", user="root", password="", 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, 'end')
        show()
        MessageBox.showinfo("Insert Status", "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', font=('bold', 10))
fid.place(x=20, y=290);

fname = Label(root, text='Enter Name', font=('bold', 10))
fname.place(x=20, y=320);

fsalary = Label(root, text='Enter Salary', font=('bold', 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", font=("italic", 10), bg="white", command=delete)
delete.place(x=100, y=390)

update = Button(root, text="Update", font=("italic", 10), bg="white", command=update)
update.place(x=160, y=390)

get = Button(root, text="Get", font=("italic", 10), bg="white", command=get)
get.place(x=225, y=390)

list = Listbox(root)
list.place(x=360, y=250)

student = Label(root, text='Student', font=('bold', 15))
student.place(x=130, y=470);

id = Label(root, text='Enter ID', font=('bold', 10))
id.place(x=20, y=510);

name = Label(root, text='Enter Name', font=('bold', 10))
name.place(x=20, y=540);

address = Label(root, text='Enter Address', font=('bold', 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, text="Insert", font=("italic", 10), bg="white", command=insert)
insert.place(x=40, y=610)

delete = Button(root, text="Delete", font=("italic", 10), bg="white", command=delete)
delete.place(x=100, y=610)

update = Button(root, text="Update", font=("italic", 10), bg="white", command=update)
update.place(x=160, y=610)

get = Button(root, text="Get", font=("italic", 10), bg="white", command=get)
get.place(x=225, y=610)

list = Listbox(root)
list.place(x=360, y=470)
show()

root.mainloop()

如何分隔每个表格的 4 个按钮?我的 Python GUI 中总共有 12 个按钮(插入、删除、更新、获取)*3

我应该使用什么 python 命令?谢谢!

【问题讨论】:

请向我们展示您的代码,以便我们更好地理解您的意思 我刚刚编辑过,上面是我的python代码的一部分。我以插入按钮为例。我的问题是如何让 2 个插入按钮适用于不同的表格。一个给学生,另一个给教职员工。 两个不同的按钮应该有两个不同的功能。是的,在这种情况下,您将需要 4*3、12 个按钮,或者您可以给他们选项,并根据他们的选项,您可以显示哪个表格。如果您需要详细的答案,请告诉我 是的,你能告诉我如何做到这一点的示例和代码吗?谢谢。 这很有帮助!非常感谢! 【参考方案1】:

我已尝试修复我发现的大部分代码问题,但首先让我们关注您的主要问题。理想的方式是使用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()

请注意,这里每个功能只需要 1 个按钮。

然后将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", user="root", password="", database="test0910")
            cursor = con.cursor()
            cursor.execute("insert into student values(%s,%s,%s)",(id,name,address))
            cursor.execute("commit");

            e_id.delete(0, 'end')
            e_name.delete(0, 'end')
            e_address.delete(0, 'end')
            show()
            messageBox.showinfo("Insert Status", "Inserted Successfully");
            con.close()

所以我希望你对正在发生的事情有一个基本的了解。如果没有,就像用户应该首先选择一个选项,然后单击按钮,然后才进行其余的操作。对代码进行必要的更改,使其符合您的需求。

同样,根据您的目的,继续定义 3 个其他按钮和 3 个功能。

我改变了什么?

您使用连接将数据插入数据库,因此它不是一种安全的方法,并且会暴露于 sql 注入。所以我将它们更改为参数替换。在哪里使用 %s 作为占位符。 Take a look here for better understanding of these

我注意到您将函数命名为 insert()get() 等等。这样命名是不准确的,因为某些 tkinter 小部件具有 insert()delete() 方法,因此可能会导致以后对 python 的混淆。

避免将变量命名为listid,因为这些是内置函数,以后会再次造成混淆。

我导入了messagebox,而我注意到你使用了Messagebox。我不确定tkinter.Messagebox 是否存在,它可能会抛出错误,如果没有,它可以使用。

您可以将更多 mysql 表名添加到列表choices 中,它将作为选项出现在Combobox 上。 Check out more on Combobox

我为什么说from tkinter import ttk?这是因为Combobox 是一个 ttk 小部件而不是直接的 tkinter 小部件,这意味着它应用了一个主题(看起来很现代)。

我试图尽可能简单地解释这一点,希望您对如何继续有一个完美的想法。如果有任何错误或疑问,请告诉我。

干杯

【讨论】:

非常感谢!很有帮助! @Zeddio 嗨,如果您能将此标记为正确答案,我将不胜感激,因此我可以将 Q 标记为已关闭。 @Cool Cloud 我希望 Zeddio 有朝一日回来给你打勾,这是一个很好的回应!

以上是关于谁能告诉我如何用相同的按钮解决 python gui tkinter 但在不同的 MySQL 表中单独工作的主要内容,如果未能解决你的问题,请参考以下文章

如何用 R 平均两个(或多个直方图)

我如何用 Ruby/Python 编写这个?或者,你能把我的 LINQ 翻译成 Ruby/Python 吗?

我如何用 pafy 为进度条制作线程

谁能告诉我贝宝按钮之间的区别[关闭]

色字当头一把刀,看我如何用Python针对裸聊渗透测试

看我如何用定值 Cookie 实现反爬