python 實現GUI(圖形使用者介面)程式設計
Python支援多種圖形介面的第三方庫,包括:
-
wxWidgets
-
Qt
-
GTK
-
-
Tkinter: Tkinter 模組(Tk 介面)是 Python 的標準 Tk GUI 工具包的介面 .Tk 和 Tkinter 可以在大多數的 Unix 平臺下使用,同樣可以應用在 Windows 和 Macintosh 系統裡。Tk8.0 的後續版本可以實現本地視窗風格,並良好地執行在絕大多數平臺中。
-
wxPython:wxPython 是一款開源軟體,是 Python 語言的一套優秀的 GUI 圖形庫,允許 Python 程式設計師很方便的建立完整的、功能鍵全的 GUI 使用者介面。
-
Jython:Jython 程式可以和 Java 無縫整合。除了一些標準模組,Jython 使用 Java 的模組。Jython 幾乎擁有標準的Python 中不依賴於 C 語言的全部模組。比如,Jython 的使用者介面將使用 Swing,AWT或者 SWT。Jython 可以被動態或靜態地編譯成 Java 位元組碼。
-
Tkinter
我們來梳理一下概念:
我們編寫的Python程式碼會呼叫內建的Tkinter,Tkinter封裝了訪問Tk的介面;
Tk是一個圖形庫,支援多個作業系統,使用Tcl語言開發;
Tk會呼叫作業系統提供的本地GUI介面,完成最終的GUI。
所以,我們的程式碼只需要呼叫Tkinter提供的介面就可以了。
在GUI中,每個Button、Label、輸入框等,都是一個Widget。Frame則是可以容納其他Widget的Widget,所有的Widget組合起來就是一棵樹。
pack()
方法把Widget加入到父容器中,並實現佈局。pack()
是最簡單的佈局,grid()
可以實現更復雜的佈局。
Tkinter
建立一個GUI程式
- 1、匯入 Tkinter 模組
- 2、建立控制元件
- 3、指定這個控制元件的 master, 即這個控制元件屬於哪一個
- 4、告訴 GM(geometry manager) 有一個控制元件產生了。
例項:
#!/usr/bin/python# -*- coding: UTF-8 -*-元件importTkinter top =Tkinter.Tk()# 進入訊息迴圈 top.mainloop()
Tkinter的提供各種控制元件,如按鈕,標籤和文字框,一個GUI應用程式中使用。這些控制元件通常被稱為控制元件或者部件。
目前有15種Tkinter的部件。我們提出這些部件以及一個簡短的介紹,在下面的表:
控制元件 | 描述 |
---|---|
Button | 按鈕控制元件;在程式中顯示按鈕。 |
Canvas | 畫布控制元件;顯示圖形元素如線條或文字 |
Checkbutton | 多選框控制元件;用於在程式中提供多項選擇框 |
Entry | 輸入控制元件;用於顯示簡單的文字內容 |
Frame | 框架控制元件;在螢幕上顯示一個矩形區域,多用來作為容器 ***************************** |
Label | 標籤控制元件;可以顯示文字和點陣圖 |
Listbox | 列表框控制元件;在Listbox視窗小部件是用來顯示一個字串列表給使用者 |
Menubutton | 選單按鈕控制元件,由於顯示選單項。 |
Menu | 選單控制元件;顯示選單欄,下拉選單和彈出選單 |
Message | 訊息控制元件;用來顯示多行文字,與label比較類似 |
Radiobutton | 單選按鈕控制元件;顯示一個單選的按鈕狀態 |
Scale | 範圍控制元件;顯示一個數值刻度,為輸出限定範圍的數字區間 |
Scrollbar | 滾動條控制元件,當內容超過視覺化區域時使用,如列表框。. |
Text | 文字控制元件;用於顯示多行文字 |
Toplevel | 容器控制元件;用來提供一個單獨的對話方塊,和Frame比較類似 |
Spinbox | 輸入控制元件;與Entry類似,但是可以指定輸入範圍值 |
PanedWindow | PanedWindow是一個窗口布局管理的外掛,可以包含一個或者多個子控制元件。 |
LabelFrame | labelframe 是一個簡單的容器控制元件。常用與複雜的窗口布局。 |
tkMessageBox | 用於顯示你應用程式的訊息框。 |
標準屬性
標準屬性也就是所有控制元件的共同屬性,如大小,字型和顏色等等。
屬性 | 描述 |
Dimension | 控制元件大小; |
Color | 控制元件顏色; |
Font | 控制元件字型; |
Anchor | 錨點; |
Relief | 控制元件樣式; |
Bitmap | 點陣圖; |
Cursor | 游標; |
幾何管理
Tkinter控制元件有特定的幾何狀態管理方法,管理整個控制元件區域組織,一下是Tkinter公開的幾何管理類:包、網格、位置
幾何方法 | 描述 |
pack() | 包裝; |
grid() | 網格; |
place() | 位置; |
#!/usr/bin/env python import os from time import sleep from Tkinter import * class DirList(object): def __init__(self, initdir=None): self.top = Tk() self.label = Label(self.top, text='Directory Lister v1.2') self.label.pack() self.cwd=StringVar(self.top) self.dirl = Label(self.top, fg='blue', font=('Helvetica', 12, 'bold')) self.dirl.pack() self.dirfm = Frame(self.top) self.dirsb = Scrollbar(self.dirfm) self.dirsb.pack(side=RIGHT, fill=Y) self.dirs = Listbox(self.dirfm, height=15, width=50, yscrollcommand=self.dirsb.set) self.dirs.bind('<Double-1>', self.setdirandgo) self.dirsb.config(command=self.dirs.yview) self.dirs.pack(side=LEFT, fill=BOTH) self.dirfm.pack() self.dirn = Entry(self.top, width=50, textvariable=self.cwd) self.dirn.bind('<Return>', self.dols) self.dirn.pack() self.bfm = Frame(self.top) self.clr = Button(self.bfm, text='Clear', command=self.clrdir, activeforeground='white', activebackground='blue') self.ls = Button(self.bfm, text='List Directory', command=self.dols, activeforeground='white', activebackground='green') self.quit = Button(self.bfm, text='Quit', command=self.top.quit, activeforeground='white', activebackground='red') self.clr.pack(side=LEFT) self.ls.pack(side=LEFT) self.quit.pack(side=LEFT) self.bfm.pack() if initdir: self.cwd.set(os.curdir) self.dols() def clrdir(self, ev=None): self.cwd.set('') def setdirandgo(self, ev=None): self.last = self.cwd.get() self.dirs.config(selectbackground='red') check = self.dirs.get(self.dirs.curselection()) if not check: check = os.curdir self.cwd.set(check) self.dols() def dols(self, ev=None): error = '' tdir = self.cwd.get() if not tdir: tdir = os.curdir if not os.path.exists(tdir): error = tdir + ': no such file' elif not os.path.isdir(tdir): error = tdir + ': not a directory' if error: self.cwd.set(error) self.top.update() sleep(2) if not (hasattr(self, 'last') \ and self.last): self.last = os.curdir self.cwd.set(self.last) self.dirs.config( selectbackground='LightSkyBlue') self.top.update() return self.cwd.set( 'FETCHING DIRECTORY CONTENTS...') self.top.update() dirlist = os.listdir(tdir) dirlist.sort() os.chdir(tdir) self.dirl.config(text=os.getcwd()) self.dirs.delete(0, END) self.dirs.insert(END, os.curdir) self.dirs.insert(END, os.pardir) for eachFile in dirlist: self.dirs.insert(END, eachFile) self.cwd.set(os.curdir) self.dirs.config( selectbackground='LightSkyBlue') def main(): d = DirList(os.curdir) mainloop() if __name__ == '__main__': main()