Python 下用 Tkinter 製做 GUI

什麼是 GUI

既然要製做 GUI,那麼就要先明確什麼是 GUI。wiki上是這麼說的: html

圖形用戶界面(Graphical User Interface,簡稱 GUI)是指採用圖形方式顯示的計算機操做用戶接口。 python

曾經有個同窗這麼跟我說,「MATLAB 有個 GUI 的功能,貌似很強大啊」,聽完我就凌亂了,圖形用戶界面何時成了 MATLAB 的專屬功能了?我日常用的 Windows 或者 Linux、Mac 都是在圖形用戶界面下進行操做的,若是想看一看命令行界面,Windows 能夠在「運行」中輸入 cmd 而後回車,Linux下能夠直接 alt+F1(切換回來用 alt+F7)。簡單來講,GUI 提供給用戶一種更加直白的圖形化的人機交互界面。 小程序

Python 中的 GUI 工具包

若是想用 Python 語言製做出一個程序的 GUI,不只僅能夠用 Tkinter 一個包,最多見的還有 wxPython 和 PyQt,還有不少不少(我不熟悉啊 (╯▽╰))。 函數

  1. wxPython:wxPython 建立的是 wxWidgets。它的好處是,能夠經過簡單的命令就建立出比較漂亮的界面,而且在中國的使用人數挺多,遇到問題在網上找起答案來比較輕鬆。缺點是並非 Python 的標準工具包,還須要另外安裝。官網在這裏,官網提供的英文教程在這裏 工具

  2. PyQt:和名字同樣,建立的是 Qt 的 GUI。Qt 的 GUI 固然是漂亮的不能再漂亮了。優勢是,建立出的 GUI 很漂亮,且有圖形化的 GUI 設計軟件 Qt Designer 來使整個設計過程簡單化。缺點:一樣不是 Python 的標準工具包,還須要另外安裝,若是手工輸入 GUI 代碼習慣了,有時候圖形化的 GUI 設計軟件反而不習慣。官網在這裏這裏有一個比較不錯的中文教程,主要講的是 Qt Designer 的入門使用,很不錯。 oop

  3. Tkinter: 從名字能夠看出,建立的是 Tk 的GUI。優勢很明顯,是一個已經半官方化的工具包,能夠直接使用,無需安裝,而且教程衆多,幾乎全部介紹 Python 入門的書,只要說起 GUI 設計都會講 Tkinter。缺點同樣明顯,設計出的 GUI 很難看,要問多難看,你本身看看 Python 的那個 IDLE 就行了,土的掉渣啊,並且元件同樣不多,若是隻是編寫一些小程序的話還能夠,若是編寫大程序要用到比較複雜的元件的話,就須要從提供的元件裏找一些替代品了,手工輸入代碼,有時候很累啊。可是我認爲用 Tkinter 來入門 GUI 設計是很好的,由於思路清晰,代碼簡單,這也就是爲何我在這裏只介紹 Tkinter 的緣由。一個英文教程在這裏以前的網站已經不在了,做者將其移到了這裏,貌似開始將從前未寫完的補充完整了{: style=「color: red」}),因爲我不想記住全部元件的方法,因此用到的話就來這裏查詢,很方便。 學習

GUI 的設計基本思路

但你開始學習 Python 的時候,全部都會考訴你,Python 是 OOP(面向對象程序設計)的程序語言,可是我認爲「類」的概念對於初學者是很是難以理解的,並且也沒有人規定在 Python 中必須使用「類」,因此我下面的例子,都不是以定義「類」的形式出現,而是以簡單的定義「函數」的形式出現,使代碼簡單、易懂。 網站

對於 GUI 的設計,我認爲是「不要着急,不要着急」。先確保實現主要功能的函數正常運行再來考慮 GUI 也不遲。GUI 的設計主要包括下面三個步驟: ui

  1. 建立主窗體
  2. 建立元件
  3. 顯示元件
  4. 進入窗體的主循環

下面是一個簡單的例子: spa

import Tkinter

root=Tkinter.Tk()  %建立主窗體
MainLabel=Tkinter.Label(root,text="I am so ugly. -- Tkinter",font="Times 16 bold")  %建立元件
MainLabel.pack()  %顯示元件
root.mainloop()  %進入窗體的主循環

這個例子中,只包含一個元件是 Label,最後效果就是

根據須要,能夠在主窗口中建立多個元件,每個元件所擁有的參數不一樣,可是有一點是同樣的,就是第一個參數必定是其所屬的窗口的變量名。上面的例子中,元件 Label就是隸屬於 root,因此在調用 pack 方法以後,這個元件就會在 root 窗口中顯示了,只與顯示的位置和顯示的樣子,須要調整 pack方法的參數,我這裏使用默認值,因此什麼參數也沒有,具體 pack 的用法能夠參照這裏

這三步其實就是 Tkinter GUI 設計的所有了,剩下的就是每一個元件的位置、樣子、顯示的文字、顯示的圖像、調用的函數等等元件參數上的設定了,這就涉及到每一個元件包含哪些參數、每一個參數是什麼意思的問題了,這個能夠經過查詢我提到的那個網站來獲得。

在 GUI 設計中有如下幾點須要注意(持續更新中):

  1. 對於元件函數的調用,有兩種方式:直接綁定和間接綁定。直接綁定就是在元件 Button 中的參數 command 中設定回調的函數名稱,以下:

    ButtonInput=Tkinter.Button(root,text="Input",command=InputString)

    間接綁定是用 bind 方法,對於全部元件都有這個方法,形式以下:

    ButtonInput.bind('<Return>',InputString)

    bind 須要指定一種觸發方式,這裏的觸發方式就再也不僅僅侷限於 Button 的左鍵單擊了,鍵盤輸入、鼠標點擊都是能夠的,我這裏的觸發方式是 <Return>,也就是回車。可是要注意的是,bind 是綁定在一個元件上的,也就是說,當焦點在這個元件上的時候觸發纔有用,並且回調的函數必需要要有一個 event 做爲輸入參數,若是沒有就直接 None 好了,以下:

    def InputString(event=None):
       …
       …
       …

    這兩種方法使用的時候有一個共同須要注意的地方就是,回調函數不要出現參數,下面這種就是錯誤的:

    ButtonInput=Tkinter.Button(root,text="Input",command=InputString())

    若是這樣,程序就會直接調用函數 InputString(),而不是等到用戶點擊按鈕的時候再調用了,若是必定要向回調的函數中加入參數的話,就用 lambda吧,以下:

    ButtonInput=Tkinter.Button(root,text="Input",command=lambda x: InputString(x))
  2. 顯示元件的方法不只僅有 pack(),還有 grid(),若是元件排列須要很整齊,能夠用 grid(),經過輸入行數和列數來控制元件的顯示位置,二者的比較和使用,能夠參見這裏

  3. 建立主窗口用 Tkinter.Tk(),可是有的時候須要有一些子窗口,能夠用 Tkinter.Toplevel() 來建立,保證子窗口一建立出來就在全部窗口的最前面。當運行完某個回調函數須要找回焦點的時候能夠用全部元件都有的方法 focus(),來獲得某個元件的焦點。
  4. 窗口退出的時候,能夠用方法 quit(),也能夠用 destroy(),好比:

    root.quit()
  5. 若是某個元件須要更新,好比圖片刷新,能夠先調用 destroy() 這個方法摧毀掉這個元件,再將這個元件重建。若是隻是 Label 元件的文字上的變更(好比狀態欄的文字變化),能夠用 StringVar(),須要輸入什麼直接調用 set() 方法就能夠了,以下:

    v = Tkinter.StringVar()
    Tkinter.Label(master, textvariable=v).pack()
    v.set("New Text!")
  6. 菜單欄的建立比較麻煩,以下:

    from Tkinter import *
     root = Tk()
    
     def hello():
         print('hello')
    
     def about():
         print('我是開發者')
    
     menubar = Menu(root)
    
     #建立下拉菜單File,而後將其加入到頂級的菜單欄中
     filemenu = Menu(menubar,tearoff=0)
     filemenu.add_command(label="Open", command=hello)
     filemenu.add_command(label="Save", command=hello)
     filemenu.add_separator()
     filemenu.add_command(label="Exit", command=root.quit)
     menubar.add_cascade(label="File", menu=filemenu)
    
     #建立另外一個下拉菜單Edit
     editmenu = Menu(menubar, tearoff=0)
     editmenu.add_command(label="Cut", command=hello)
     editmenu.add_command(label="Copy", command=hello)
     editmenu.add_command(label="Paste", command=hello)
     menubar.add_cascade(label="Edit",menu=editmenu)
     #建立下拉菜單Help
     helpmenu = Menu(menubar, tearoff=0)
     helpmenu.add_command(label="About", command=about)
     menubar.add_cascade(label="Help", menu=helpmenu)
    
     #顯示菜單
     root.config(menu=menubar)
    
     mainloop()

    其中 tearoff=0 就是下拉菜單和窗口是一體的,不能獨立造成一個窗口,效果以下:

    若是 tearoff=1,則效果以下,點擊那個虛線會造成一個新的窗口。

  7. 簡單的提示窗口(好比報錯之類的),能夠直接調用 tkMessageBox 庫,具體用法能夠參見這裏。簡單的數字輸入、文件選取、顏色選取,能夠直接調用 tkSimpleDialog 庫,具體用法能夠參見這裏
  8. Tkinter 自帶的下拉框元件 Listbox 很很差用,可使用 ttk 庫中的 Combobox 元件,使用以下:

    boudrate=Tkinter.StringVar()
    boudrate.set("9600")
    manul_boudrate=ttk.Combobox(root,text=boudrate,values=["2400","9600","12900"])

    須要獲得 Combobox 中選中的字符串的時候,直接 boudrate.get() 就能夠了。

相關文章
相關標籤/搜索