如何从用Python制作的GUI连接到MySQL数据库

2024-09-27 20:15:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Tkinter创建了单选按钮,每当选中单选按钮时,单击submit按钮后,我希望通过它在数据库中增加一个单选按钮。

最重要的是我想连接到MySQL数据库,但我不知道在我的脚本中添加什么。

from Tkinter import *
root= Tk()
frm=Frame(root,relief=RAISED,borderwidth=5,bg="green" )
Label(frm,text= "PLEASE SELECT CANDIDATE\n OF YOUR CHOICE\n\n\n\n",bg="green").pack()
var = IntVar()
for text, value in [('YOWERI KAGUTA MUSEVENI', 1), ('KIIZA BESIGYE', 2), ('AMAAMA JOHN MBABAZI ', 3),
('KARUNGI SHARON', 4), ('BYAMUKAMA OSCAR', 5),
('MATILDA MOREEN', 6), ('DUNCANS', 7)]:

 Radiobutton(frm, text=text, value=value, variable=var,padx=18,bg="green"
 ).pack(anchor=E, fill=X, padx=18 )
 var.set(0)
frm.pack(pady=10)
btn=Button(frm,text='submit',fg="black",bg="yellow")
btn.pack(anchor=E)
root.title("movie chooser")

root.mainloop()

Tags: text数据库valuetkintervargreenroot按钮
1条回答
网友
1楼 · 发布于 2024-09-27 20:15:45

我将一步一步地指导你解决问题。我想你已经在Ubuntu上安装了MySQL服务器。

无论您使用的是Tkinter还是其他GUI包,实现目标的方法都是一样的。

我需要使用什么工具?

首先,您需要安装一个Python数据库接口,该接口允许您使用Python与MySQL服务器通信。这是详尽的list of Python MySQL databse interfaces

哪一个更适合安装?我只想谈谈我自己用过的两个词:MySQLdbMySQL connector

MySQLdb是一个C库,比纯Python库MySQL connector更快。为了便于携带,最好选择后者。为了速度你需要选择第一个。注意,Django使用MySQLdb。这也是我最喜欢的数据库接口,我将在下面使用。您可以在这两个接口here之间找到一个很好的比较。

如何在Ubuntu 14.04.3lts上安装MySQLdb?

安装MySQLdb的常用方法是使用pip,如here所述。但是对于Ubuntu,根据我个人的经验,我更喜欢这样安装:

  • 安装所需的依赖项:sudo apt-get install build-essential python-dev libmysqlclient-dev
  • 安装MySQL数据库接口本身:sudo apt-get install python-mysqldb

现在您应该可以导入它: >>> import MySQLdb

接口设计

首先,我们将要求用户向MySQL服务器键入他的凭据:

enter image description here

如果凭据错误,除非用户存在应用程序,否则窗口仍会提示自己。

如果凭据正确,则用户可以通过与您设计的窗口类似的新窗口将其收藏的“开始”保存/添加到数据库中:

enter image description here

实施应用程序:

1。数据库设计:

我选择最简单的,只是为了满足眼前的需要:

mysql> CREATE DATABASE begueradj;

现在是时候创建一个表来保存你最喜欢的星星了。它将包含它们的名称starname和自动递增的主键id

mysql> USE begueradj;
mysql> CREATE TABLE mystars(id INT(2) NOT NULL AUTO_INCREMENT,
                            starname VARCHAR(40) NOT NULL,
                            PRIMARY KEY(id)
                            );

2。第一个接口实现:

第一个屏幕截图所表示的接口由initialize_user_interface()函数创建:

def initialize_user_interface(self):
        """Draw a user interface allowing the user to type
        MySQL server credentials
        """
        self.parent.title("DB operations")       
        self.parent.grid_rowconfigure(0,weight=1)
        self.parent.grid_columnconfigure(0,weight=1)
        self.parent.config(background="lavender")

        self.label_user=Tkinter.Label(self.parent,text="DB User: ",anchor=Tkinter.W,background="dark slate gray",foreground="white", font="Helvetica 8  bold")
        self.label_password=Tkinter.Label(self.parent,text="DB Password:", anchor=Tkinter.W,background="dark slate gray",foreground="white", font="Helvetica 8  bold")

        self.label_user.grid(row=0,column=0,sticky=Tkinter.E+Tkinter.W)
        self.label_password.grid(row=1,column=0, sticky=Tkinter.E+Tkinter.W)

        self.dbuser=Tkinter.Entry(self.parent)
        self.dbpassword=Tkinter.Entry(self.parent,show="*")

        self.dbuser.grid(row=0,column=1,sticky=Tkinter.E+Tkinter.W)
        self.dbpassword.grid(row=1,column=1,sticky=Tkinter.E+Tkinter.W)

        self.connectb=Tkinter.Button(self.parent,text="Log in",font="Helvetica 10 bold",command=self.dbconnexion)
        self.cancelb=Tkinter.Button(self.parent,text="Cancel",command=self.parent.quit,font="Helvetica 10 bold")

        self.connectb.grid(row=2,column=1,sticky=Tkinter.W)
        self.cancelb.grid(row=2,column=2)

主要是将函数dbconnexion()绑定到登录按钮self.connectb

def dbconnexion(self): 
        """ Pop up a new window if the credentials are the right ones
        """       
        if self.dbuser.get()=="beueradj" and  self.dbpassword.get()=="begueradj":
            # Pop up the new interface if credentials are OK
            self.item_insertion_window()
        else:
            # Loop over the login interface if not
            self.initialize_user_interface()

3。第二个接口实现:

如果凭据正确,则显示“插入”窗口以将收藏的星星添加到数据库中。要弹出新窗口,需要使用^{}方法。

这是由函数item_insertion_window()完成的:

def item_insertion_window(self):
        """ Display the stars to add to the database
        Group the stars using radio buttons
        """
        self.new_window=Tkinter.Toplevel(self)
        self.new_window.wm_title("Add my favorite stars")
        self.new_window.grid_rowconfigure(0, weight=1)
        self.new_window.grid_columnconfigure(0, weight=1)

        self.exitb=Tkinter.Button(self.new_window,text="Exit",command=self.new_window.quit)
        self.submitb=Tkinter.Button(self.new_window,text="Submit",command=self.increment_db)
        self.exitb.grid(row=8,column=1)
        self.submitb.grid(row=8,column=0,sticky=Tkinter.W)

        self.v=IntVar()
        self.tvstars=[('YOWERI KAGUTA MUSEVENI', 1), ('KIIZA BESIGYE', 2), 
                      ('AMAAMA JOHN MBABAZI ', 3), ('KARUNGI SHARON', 4), 
                      ('BYAMUKAMA OSCAR', 5), ('MATILDA MOREEN', 6), 
                      ('DUNCANS', 7)]
        self.i=0
        for self.txt, star in self.tvstars:
            self.i=self.i+1
            self.rb=Tkinter.Radiobutton(self.new_window,text=self.txt,variable=self.v,value=star)
            self.rb.grid(row=self.i,column=0,sticky=Tkinter.W)

4。如何获取Tkinter单选按钮文本?

在官方文档中,只有一种方法可以检索选中的单选按钮的值,但是没有提到任何方法可以获取我们真正感兴趣的文本(星星的名字)。我也没有在StackOverflow上找到任何关于这个主题的帖子。我的诀窍是编写一个字典,使用which_artist()函数将单选按钮值映射到对应星的名称:

def which_artist(self,radiob):
        """Return star's name
        """
        self.artists = {
                        1:"YOWERI KAGUTA MUSEVENI",
                        2:"KIIZA BESIGYE",
                        3:"AMAAMA JOHN MBABAZI",
                        4:"KARUNGI SHARON",
                        5:"BYAMUKAMA OSCAR",
                        6:"MATILDA MOREEN",
                        7:"DUNCANS",
        }
        return self.artists.get(radiob,"Unknown")

此函数将在以下步骤中有用。

5。将您喜爱的星星添加到数据库:

首先,您可以将MySQL服务器参数保存在配置文件config.py中,但是由于我们的项目很小,而且很显然您以后不会再对其进行扩展,所以让我们将这些凭据保存在函数本身中:

self.config = {
                  'user': 'begueradj',
                  'passwd': 'begueradj',
                  'host': '127.0.0.1',
                  'db': 'begueradj',
        }

下面是实现插入的函数:

def increment_db(self):
    """ Insert the selected favorite star into the database.
    """
    self.chosenartist=self.which_artist(self.v.get())
    print self.chosenartist

    self.config = {
              'user': 'begueradj',
              'passwd': 'bregredj',
              'host': '127.0.0.1',
              'db': 'begueradj',
    }
    try:
        self.connecttodb=MySQLdb.connect(**self.config)
    except MySQLdb.Error:
        print"Connexion error"

    self.cursor=self.connecttodb.cursor()

    self.cursor.execute("""INSERT INTO testtable(starname) VALUES(%s)""",self.chosenartist)

    self.connecttodb.commit()
    self.connecttodb.close()

当然,您需要根据自己的设置更改配置字典self.config

另外,更适合将self.connecttodb.close()绑定到退出按钮self.exitb6个。应用程序:

以下是完整的程序:

'''
Created on Feb 29, 2016

@author: begueradj
'''
import Tkinter
import MySQLdb
from Tkinter import IntVar


class Begueradj(Tkinter.Frame):
    '''
    classdocs
    '''


    def __init__(self, parent):
        '''
        Constructor
        '''
        Tkinter.Frame.__init__(self, parent)
        self.parent=parent
        self.initialize_user_interface()

    def initialize_user_interface(self):
        """Draw a user interface allowing the user to type
        MySQL server credentials
        """
        self.parent.title("DB operations")       
        self.parent.grid_rowconfigure(0,weight=1)
        self.parent.grid_columnconfigure(0,weight=1)
        self.parent.config(background="lavender")

        self.label_user=Tkinter.Label(self.parent,text="DB User: ",anchor=Tkinter.W,background="dark slate gray",foreground="white", font="Helvetica 8  bold")
        self.label_password=Tkinter.Label(self.parent,text="DB Password:", anchor=Tkinter.W,background="dark slate gray",foreground="white", font="Helvetica 8  bold")

        self.label_user.grid(row=0,column=0,sticky=Tkinter.E+Tkinter.W)
        self.label_password.grid(row=1,column=0, sticky=Tkinter.E+Tkinter.W)

        self.dbuser=Tkinter.Entry(self.parent)
        self.dbpassword=Tkinter.Entry(self.parent,show="*")

        self.dbuser.grid(row=0,column=1,sticky=Tkinter.E+Tkinter.W)
        self.dbpassword.grid(row=1,column=1,sticky=Tkinter.E+Tkinter.W)

        self.connectb=Tkinter.Button(self.parent,text="Log in",font="Helvetica 10 bold",command=self.dbconnexion)
        self.cancelb=Tkinter.Button(self.parent,text="Cancel",command=self.parent.quit,font="Helvetica 10 bold")

        self.connectb.grid(row=2,column=1,sticky=Tkinter.W)
        self.cancelb.grid(row=2,column=2)

    def item_insertion_window(self):
        self.new_window=Tkinter.Toplevel(self)
        self.new_window.wm_title("Add my favorite stars")
        self.new_window.grid_rowconfigure(0, weight=1)
        self.new_window.grid_columnconfigure(0, weight=1)

        self.exitb=Tkinter.Button(self.new_window,text="Exit",command=self.new_window.quit)
        self.submitb=Tkinter.Button(self.new_window,text="Submit",command=self.increment_db)
        self.exitb.grid(row=8,column=1)
        self.submitb.grid(row=8,column=0,sticky=Tkinter.W)

        self.v=IntVar()
        self.tvstars=[('YOWERI KAGUTA MUSEVENI', 1), ('KIIZA BESIGYE', 2), 
                      ('AMAAMA JOHN MBABAZI ', 3), ('KARUNGI SHARON', 4), 
                      ('BYAMUKAMA OSCAR', 5), ('MATILDA MOREEN', 6), 
                      ('DUNCANS', 7)]
        self.i=0
        for self.txt, star in self.tvstars:
            self.i=self.i+1
            self.rb=Tkinter.Radiobutton(self.new_window,text=self.txt,variable=self.v,value=star)
            self.rb.grid(row=self.i,column=0,sticky=Tkinter.W)


    def which_artist(self,radiob):
        self.artists = {
                        1:"YOWERI KAGUTA MUSEVENI",
                        2:"KIIZA BESIGYE",
                        3:"AMAAMA JOHN MBABAZI",
                        4:"KARUNGI SHARON",
                        5:"BYAMUKAMA OSCAR",
                        6:"MATILDA MOREEN",
                        7:"DUNCANS",
        }
        return self.artists.get(radiob,"Unknown")

    def increment_db(self):
        #print self.v.get()
        self.chosenartist=self.which_artist(self.v.get())
        print self.chosenartist

        self.config = {
                  'user': 'begueradj',
                  'passwd': 'begueradj',
                  'host': '127.0.0.1',
                  'db': 'begueradj',
        }
        try:
            self.connecttodb=MySQLdb.connect(**self.config)
        except MySQLdb.Error:
            print"Connexion error"

        self.cursor=self.connecttodb.cursor()

        self.cursor.execute("""INSERT INTO mystars(starname) VALUES(%s)""",self.chosenartist)

        self.connecttodb.commit()
        self.connecttodb.close()



    def dbconnexion(self):        
        if self.dbuser.get()=="begueradj" and  self.dbpassword.get()=="begueradj":
            self.item_insertion_window()
        else:
            self.initialize_user_interface()



def main():
    root=Tkinter.Tk()
    d=Begueradj(root)
    root.mainloop()

if __name__=="__main__":
    main()

<强>7。演示

我把一颗星星插进去Tkinter接口。让我们看看这是否有效:

mysql> SELECT * FROM begueradj.mystars;
+----+------------------------+
| id | starname               |
+----+------------------------+
|  1 | YOWERI KAGUTA MUSEVENI |
+----+------------------------+
1 row in set (0.00 sec)

希望这有帮助。

更新:

你问过我如何更新,但在理解更新语句的逻辑时,我不清楚你的评论。所以我只根据你的评论显示的一小段代码来回答。

您似乎想通过语句检查选择了哪个单选按钮:self.var.get(),并将某个值增加1(这就是为什么我不理解您的update语句:所以无论按哪个单选按钮,您都会执行相同的操作;这意味着单选按钮没有意义)。

如果你想从你自己的神秘测试的角度来做,你需要使用^{}选项,并为你创建的每个单选按钮将一个方法绑定到command选项。

要使用variable选项,您需要首先运行以下命令:

self.v = IntVar()

然后,对于您设置的每个单选按钮:variable=self.vcommand = self.get_radiobutton_id

所述方法必须返回所选单选按钮的标识符:

self defself.get_radiobutton_id(self):
   return v.get()

相关问题 更多 >

    热门问题