簡體   English   中英

如何從python中的gui連接到mysql數據庫

[英]how to connect to mysql database from gui made in python

我已經使用Tkinter創建了單選按鈕,每當選中單選按鈕時,單擊提交按鈕后,我想通過該按鈕在數據庫中增加一個。

最重要的是,我想連接到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()

我將逐步指導您解決問題。 我假設您已經在Ubuntu上安裝了MySQL服務器。

無論您使用的是Tkinter還是其他GUI軟件包,實現目標的方法均保持不變。

我需要使用哪些工具?

首先,您需要安裝一個Python數據庫接口,該接口允許您使用Python與MySQL服務器進行通信。 這是Python MySQL數據庫接口的詳盡列表

哪個更好安裝? 我只想談論我自己使用過的其中兩個: MySQLdbMySQL connector

MySQLdb是一個C庫,它比純Python庫的MySQL Connector更快。 為了便於攜帶,最好選擇后一種。 為了提高速度,您需要選擇第一個。 請注意, Django使用MySQLdb。 那也是我接下來將要使用的我最喜歡的數據庫接口。 您可以在此處找到這兩個接口之間的比較。

如何在Ubuntu 14.04.3 LTS上安裝MySQLdb?

安裝MySQLdb的常用方法是使用PIP描述這里 但是對於Ubuntu,根據我的個人經驗,我更喜歡這樣安裝:

  • 安裝所需的依賴項: sudo apt-get install build-essential python-dev libmysqlclient-dev
  • 安裝MySQL數據庫接口本身: sudo apt-get install python-mysqldb

現在您應該能夠導入它: >>> import MySQLdb

界面設計

首先,我們將要求用戶在MySQL服務器上鍵入其憑據:

在此處輸入圖片說明

如果憑據錯誤,除非用戶存在該應用程序,否則窗口仍會提示自己。

如果憑據是正確的,則用戶可以通過類似於您設計的窗口的新窗口將自己喜歡的開始保存/添加到數據庫中:

在此處輸入圖片說明

實施應用程序:

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.第二接口實現:

如果憑據正確,則顯示插入窗口以將收藏的星星添加到數據庫。 要彈出新窗口,您需要使用Tkinter.Toplevel()方法。

這是通過函數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.exitb更合適。 6.申請:

這是完整的程序:

'''
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語句的原因:所以無論按下哪個單選按鈕,您都可以同樣的動作;這意味着單選按鈕是沒有意義的)。

但是,如果您想從自己的神秘測試角度出發,則需要使用variable選項並將每個創建的單選按鈕的方法綁定到command選項。

要使用variable選項,您首先需要運行以下命令:

self.v = IntVar()

然后,為您設置的每個variable=self.v按鈕: variable=self.vcommand = self.get_radiobutton_id

有問題的方法必須返回所選單選按鈕的標識符:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM