---
title: 'GUI guide'
disqus: hackm
---
GUI guide
===
## Table of Contents
[TOC]
## Beginners Guide
> 參考網址:https://www.itread01.com/content/1547705544.html
核心視窗物件概覽
1. Button:一個簡單的按鈕,用來執行一個命令或別的操作。
2. Canvas:組織圖形。這個部件可以用來繪製圖表和圖,建立圖形編輯器,實現定製視窗部件。
3. Checkbutton:代表一個變數,它有兩個不同的值。點選這個按鈕將會在這兩個值間切換。
4. Entry:文字輸入域。
5. Frame:一個容器視窗部件。幀可以有邊框和背景,當建立一個應用程式或dialog(對話)版面時,幀被用來組織其它的視窗部件。
6. Label:顯示一個文字或圖象。
7. Listbox:顯示供選方案的一個列表。listbox能夠被配置來得到radiobutton或checklist的行為。
8. Menu:選單條。用來實現下拉和彈出式選單。
9. Menubutton:選單按鈕。用來實現下拉式選單。
10. Message:顯示一文字。類似label視窗部件,但是能夠自動地調整文字到給定的寬度或比率。
11. Radiobutton:代表一個變數,它可以有多個值中的一個。點選它將為這個變數設定值,並且清除與這同一變數相關的其它radiobutton。
12. Scale:允許你通過滑塊來設定一數字值。
13. Scrollbar:為配合使用canvas, entry, listbox, and text視窗部件的標準滾動條。
14. Text:格式化文字顯示。允許你用不同的樣式和屬性來顯示和編輯文字。同時支援內嵌圖象和視窗。
15. Toplevel:一個容器視窗部件,作為一個單獨的、最上面的視窗顯示。
16. messageBox:訊息框,用於顯示你應用程式的訊息框。
基本功能
===
## 1.建立主視窗及Label
1. 示例程式碼:
```gherkin=
# 使用Tkinter前需要先匯入
import tkinter as tk
class basedesk():
def __init__(self,master):
#第2步,實體化視窗
self.root = master
self.root.config()
self.root.title('Base page')
# 視窗大小 (長 x 寬)
self.root.geometry('500x400')
#凍結視窗(無法調整大小)
self.root.resizable(width=False, height=False)
#第3步,在圖形介面上設定標籤
#說明: bg為背景,font為字型,width為長,height為高,這裡的長和高是字元的長和高,比如height=2,就是標籤有2個字元這麼高
header_label = tk.Labeltk.Label(root, text='你好!this is Tkinter', bg='green', font=('Arial', 12), width=30, height=2)
header_label.pack()
initface(self.root)
if __name__ == '__main__':
# 第1步,建立視窗root
root = tk.Tk()
basedesk(root)
#第4步,主視窗迴圈顯示
root.mainloop()
#注意,loop因為是迴圈的意思,root.mainloop就會讓root不斷的重新整理,如果沒有mainloop, 就是一個靜態的root,傳入進去的值就不會有迴圈,mainloop就相當於一個很大的while迴圈,有個while,每點選一次就會更新一次,所以我們必須要有迴圈
# 所有的視窗檔案都必須有類似的mainloop函式,mainloop是視窗檔案的關鍵的關鍵。
```
## 2.Button
1. 簡單說明:
Button(按鈕)部件是一個標準的Tkinter視窗部件,用來實現各種按鈕。按鈕能夠包含文字或圖象,並且你能夠將按鈕與一個Python 函式或方法相關聯。當這個按鈕被按下時,Tkinter自動呼叫相關聯的函式或方法。
按鈕僅能顯示一種字型,但是這個文字可以跨行。另外,這個文字中的一個字母可以有下劃線,例如標明一個快捷鍵。預設情況,Tab鍵用於將焦點移動到一個按鈕部件。
2. 什麼時候用按鈕部件
簡言之,按鈕部件用來讓使用者說“馬上給我執行這個任務”,通常我們用顯示在按鈕上的文字或圖象來提示。按鈕通常用在工具條中或應用程式視窗中,並且用來接收或忽略輸入在對話方塊中的資料。關於按鈕和輸入的資料的配合,可以參看Checkbutton和Radiobutton部件。
3. 示例程式碼:
```gherkin=
btn = tk.Button(self.initface,text='conn_zernet',command = self.conn_zernet,height = 1,width = 15)
btn.pack(pady=(0,15))
```
> command 為自訂義function
## 3.Entry
1. 簡單說明:
Entry是tkinter類中提供的的一個單行文字輸入域,用來輸入顯示一行文字,收集鍵盤輸入(類似 HTML 中的 text)。
2. 什麼時候用:
需要使用者輸入使用者資訊時,比如我們平時使用軟體、登入網頁時,使用者互動介面讓我們登入賬戶資訊等時候可以用到。
3. 示例程式碼:
```gherkin=
e1 = tk.Entry(root, show='*', font=('Arial', 14)) # 顯示成密文形式
e2 = tk.Entry(root, show=None, font=('Arial', 14)) # 顯示成明文形式
e1.pack()
e2.pack()
```
## 4.Text
1. 簡單說明:
Text是tkinter類中提供的的一個多行文字區域,顯示多行文字,可用來收集(或顯示)使用者輸入的文字(類似 HTML 中的 textarea),格式化文字顯示,允許你用不同的樣式和屬性來顯示和編輯文字,同時支援內嵌圖象和視窗。
2. 什麼時候用:
在需要顯示編輯使用者、產品多行資訊時,比如顯示使用者詳細描述文字,產品簡介等等,支援隨時編輯。
3. 示例程式碼:
```gherkin=
# 建立並放置一個多行文字框text用以顯示,指定height=3為文字框是三個字元高度
t = tk.Text(root, height=3)
t.pack()
```
## 5.Listbox
1. 簡單說明:
Text是tkinter類中提供的的列表框部件,顯示供選方案的一個列表。listbox能夠被配置來得到radiobutton或checklist的行為。
2. 什麼時候用:
在有一個很多內容選項組成的列表提供使用者選擇時會用到。
3. 示例程式碼:
```gherkin=
# 建立Listbox
lb = tk.Listbox(root, listvariable=(1,2,3))
# 建立一個list並將值迴圈新增到Listbox控制元件中
list_items = [11,22,33,44]
for item in list_items:
lb.insert('end', item) # 從最後一個位置開始加入值
lb.insert(1, 'first') # 在第一個位置加入'first'字元
lb.insert(2, 'second') # 在第二個位置加入'second'字元
lb.delete(2) # 刪除第二個位置的字元
lb.pack()
```
## 6.Radiobutton
1. 簡單說明:
Radiobutton:代表一個變數,它可以有多個值中的一個。點選它將為這個變數設定值,並且清除與這同一變數相關的其它radiobutton。
2. 什麼時候用:
在有一個很多內容選項組成的選項列表提供使用者選擇時會用到,使用者<font color="#f00">一次只能選擇其中一個,不能多選</font>。
3. 示例程式碼:
```gherkin=
# 第1步,定義選項觸發函式功能
def print_selection():
l.config(text='you have selected ' + var.get())
# 第2步,建立三個radiobutton選項,其中variable=var, value='A'的意思就是,當我們滑鼠選中了其中一個選項,把value的值A放到變數var中,然後賦值給variable
r1 = tk.Radiobutton(root, text='Option A', variable=var, value='A', command=print_selection)
r1.pack()
r2 = tk.Radiobutton(root, text='Option B', variable=var, value='B', command=print_selection)
r2.pack()
r3 = tk.Radiobutton(root, text='Option C', variable=var, value='C', command=print_selection)
r3.pack()
```
## 7.Checkbutton
1. 簡單說明:
Checkbutton:代表一個變數,它有兩個不同的值。點選這個按鈕將會在這兩個值間切換,選擇和取消選擇。
2. 什麼時候用:
在有一個很多內容選項組成的選項列表提供使用者選擇時會用到,使用者一次可以選擇多個。
3. 示例程式碼:
```gherkin=
l = tk.Label(root, bg='yellow', width=20, text='empty')
l.pack()
# 第2步,定義觸發函式功能
def print_selection():
# 如果選中第一個選項,未選中第二個選項
if (var1.get() == 1) & (var2.get() == 0):
l.config(text='I love only Python ')
# 如果選中第二個選項,未選中第一個選項
elif (var1.get() == 0) & (var2.get() == 1):
l.config(text='I love only C++')
# 如果兩個選項都未選中
elif (var1.get() == 0) & (var2.get() == 0):
l.config(text='I do not love either')
# 如果兩個選項都選中
else:
l.config(text='I love both')
# 第1步,定義兩個Checkbutton選項並放置
# 定義var1和var2整型變數用來存放選擇行為返回值
var1 = tk.IntVar()
var2 = tk.IntVar()
# 傳值原理類似於radiobutton部件
c1 = tk.Checkbutton(root, text='Python',variable=var1, onvalue=1, offvalue=0, command=print_selection)
c1.pack()
c2 = tk.Checkbutton(root, text='C++',variable=var2, onvalue=1, offvalue=0, command=print_selection)
c2.pack()
```
## 8.Scale
1. 簡單說明:
Scale: 尺度(拉動條),允許你通過滑塊來設定一數字值。
2. 什麼時候用:
在需要使用者給出評價等級,或者給出一個評價分數,或者拉動滑動條提供一個具體的數值等等。
3. 示例程式碼:
```gherkin=
# 第1步,在圖形介面上建立一個標籤label用以顯示並放置
l = tk.Label(root, bg='green', fg='white', width=20, text='empty')
l.pack()
# 第3步,定義一個觸發函式功能
def print_selection(v):
l.config(text='you have selected ' + v)
# 第2步,建立一個尺度滑條,長度200字元,從0開始10結束,以2為刻度,精度為0.01,觸發呼叫print_selection函式
s = tk.Scale(root, label='try me', from_=0, to=10, orient=tk.HORIZONTAL, length=200, showvalue=0,tickinterval=2, resolution=0.01, command=print_selection)
s.pack()
```
## 9.Canvas
1. Canvas:畫布,提供繪圖功能(直線、橢圓、多邊形、矩形) 可以包含圖形或點陣圖,用來繪製圖表和圖,建立圖形編輯器,實現定製視窗部件。
2. 什麼時候用:
在比如像使用者互動介面等,需要提供設計的圖示、圖形、logo等資訊是可以用到畫布。
3. 示例程式碼:
```gherkin=
# 第1步,在圖形介面上建立 500 * 200 大小的畫布並放置各種元素
canvas = tk.Canvas(root, bg='green', height=200, width=500)
# 說明圖片位置,並匯入圖片到畫布上
image_file = tk.PhotoImage(file='pic.gif') # 圖片位置(相對路徑,與.py檔案同一資料夾下,也可以用絕對路徑,需要給定圖片具體絕對路徑)
image = canvas.create_image(250, 0, anchor='n',image=image_file) # 圖片錨定點(n圖片頂端的中間點位置)放在畫布(250,0)座標處
# 定義多邊形引數,然後在畫布上畫出指定圖形
x0, y0, x1, y1 = 100, 100, 150, 150
line = canvas.create_line(x0-50, y0-50, x1-50, y1-50) # 畫直線
oval = canvas.create_oval(x0+120, y0+50, x1+120, y1+50, fill='yellow') # 畫圓 用黃色填充
arc = canvas.create_arc(x0, y0+50, x1, y1+50, start=0, extent=180) # 畫扇形 從0度開啟收到180度結束
rect = canvas.create_rectangle(330, 30, 330+20, 30+20) # 畫矩形正方形
canvas.pack()
# 第3步,觸發函式,用來一定指定圖形
def moveit():
canvas.move(rect, 2, 2) # 移動正方形rect(也可以改成其他圖形名字用以移動一起圖形、元素),按每次(x=2, y=2)步長進行移動
# 第2步,定義一個按鈕用來移動指定圖形的在畫布上的位置
b = tk.Button(root, text='move item',command=moveit).pack()
```
## 10.Menu
1. 簡單說明:
Menu:選單條,用來實現下拉和彈出式選單,點下選單後彈出的一個選項列表,使用者可以從中選擇
2. 什麼時候用:
在比如像軟體或網頁互動介面等,需要提供選單選項功能提供使用者選擇選單選項功能時用到。
3. 示例程式碼:
```gherkin=
# 第1步,在圖形介面上建立一個標籤用以顯示內容並放置
l = tk.Label(root, text=' ', bg='green')
l.pack()
# 第7步,定義一個函式功能,用來代表選單選項的功能,這裡為了操作簡單,定義的功能比較簡單
counter = 0
def do_job():
global counter
l.config(text='do '+ str(counter))
counter += 1
# 第2步,建立一個選單欄,這裡我們可以把他理解成一個容器,在視窗的上方
menubar = tk.Menu(root)
# 第3步,建立一個File選單項(預設不下拉,下拉內容包括New,Open,Save,Exit功能項)
filemenu = tk.Menu(menubar, tearoff=0)
# 將上面定義的空選單命名為File,放在選單欄中,就是裝入那個容器中
menubar.add_cascade(label='File', menu=filemenu)
# 在File中加入New、Open、Save等小選單,即我們平時看到的下拉選單,每一個小選單對應命令操作。
filemenu.add_command(label='New', command=do_job)
filemenu.add_command(label='Open', command=do_job)
filemenu.add_command(label='Save', command=do_job)
filemenu.add_separator() # 新增一條分隔線
filemenu.add_command(label='Exit', command=root.quit) # 用tkinter裡面自帶的quit()函式
# 第4步,建立一個Edit選單項(預設不下拉,下拉內容包括Cut,Copy,Paste功能項)
editmenu = tk.Menu(menubar, tearoff=0)
# 將上面定義的空選單命名為 Edit,放在選單欄中,就是裝入那個容器中
menubar.add_cascade(label='Edit', menu=editmenu)
# 同樣的在 Edit 中加入Cut、Copy、Paste等小命令功能單元,如果點選這些單元, 就會觸發do_job的功能
editmenu.add_command(label='Cut', command=do_job)
editmenu.add_command(label='Copy', command=do_job)
editmenu.add_command(label='Paste', command=do_job)
# 第5步,建立第二級選單,即選單項裡面的選單
submenu = tk.Menu(filemenu) # 和上面定義選單一樣,不過此處實在File上建立一個空的選單
filemenu.add_cascade(label='Import', menu=submenu, underline=0) # 給放入的選單submenu命名為Import
# 第6步,建立第三級選單命令,即選單項裡面的選單項裡面的選單命令(有點拗口,笑~~~)
submenu.add_command(label='Submenu_1', command=do_job) # 這裡和上面建立原理也一樣,在Import選單項中加入一個小選單命令Submenu_1
# 第8步,建立選單欄完成後,配置讓選單欄menubar顯示出來
root.config(menu=menubar)
```
## 11.Frame
1. 簡單說明:
Frame:框架,用來承載放置其他GUI元素,就是一個容器,是一個在 Windows 上分離小區域的部件, 它能將 Windows 分成不同的區,然後存放不同的其他部件. 同時一個 Frame 上也能再分成兩個 Frame, Frame 可以認為是一種容器.
2. 什麼時候用:
在比如像軟體或網頁互動介面等,有不同的介面邏輯層級和功能區域劃分時可以用到,讓互動介面邏輯更加清晰。
3. 示例程式碼:
```gherkin=
# 第1步,在圖形介面上建立一個標籤用以顯示內容並放置
tk.Label(root, text='on the root', bg='red', font=('Arial', 16)).pack() # 和前面部件分開建立和放置不同,其實可以建立和放置一步完成
# 第2步,建立一個主frame,長在主window視窗上
frame = tk.Frame(root)
frame.pack()
# 第3步,建立第二層框架frame,長在主框架frame上面
frame_l = tk.Frame(frame)# 第二層frame,左frame,長在主frame上
frame_r = tk.Frame(frame)# 第二層frame,右frame,長在主frame上
frame_l.pack(side='left')
frame_r.pack(side='right')
# 第4步,建立三組標籤,為第二層frame上面的內容,分為左區域和右區域,用不同顏色標識
tk.Label(frame_l, text='on the frame_l1', bg='green').pack()
tk.Label(frame_l, text='on the frame_l2', bg='green').pack()
tk.Label(frame_l, text='on the frame_l3', bg='green').pack()
tk.Label(frame_r, text='on the frame_r1', bg='yellow').pack()
tk.Label(frame_r, text='on the frame_r2', bg='yellow').pack()
tk.Label(frame_r, text='on the frame_r3', bg='yellow').pack()
```
## 12.messageBox
1. 簡單說明:
messageBox:訊息框,用於顯示你應用程式的訊息框。
2. 什麼時候用:
在比如像軟體或網頁互動介面等,有不同的介面邏輯層級和功能區域劃分時可以用到,讓互動介面邏輯更加清晰。
3. 示例程式碼:
```gherkin=
# 要使用messagebox先要匯入模組
import tkinter.messagebox
def hit_me():
# 提示資訊對話窗
tkinter.messagebox.showinfo(title='Hi', message='你好!')
# 提出警告對話窗
# tkinter.messagebox.showwarning(title='Hi', message='有警告!')
# 提出錯誤對話窗
# tkinter.messagebox.showerror(title='Hi', message='出錯了!')
# 詢問選擇對話窗return 'yes', 'no'
# print(tkinter.messagebox.askquestion(title='Hi', message='你好!'))
# print(tkinter.messagebox.askyesno(title='Hi', message='你好!'))
# print(tkinter.messagebox.askokcancel(title='Hi', message='你好!'))
# 第4步,在圖形介面上建立一個標籤用以顯示內容並放置
tk.Button(root, text='hit me', bg='green', font=('Arial', 14), command=hit_me).pack()
```
## 13.pack/grid/place放置方式
### 1. Grid
+ grid 是方格, 所以所有的內容會被放在這些規律的方格中。例如:
```gherkin=
for i in range(3):
for j in range(3):
tk.Label(root, text=1).grid(row=i, column=j, padx=10, pady=10, ipadx=10, ipady=10)
```
+ 以上的程式碼就是建立一個三行三列的表格,其實 grid 就是用表格的形式定位的。這裡的引數 row 為行,colum 為列,padx 就是單元格左右間距,pady 就是單元格上下間距,ipadx是單元格內部元素與單元格的左右間距,ipady是單元格內部元素與單元格的上下間距。
### 2. Pack
+ 我們常用的pack(), 他會按照上下左右的方式排列.例如:
```gherkin=
tk.Label(root, text='P', fg='red').pack(side='top') # 上
tk.Label(root, text='P', fg='red').pack(side='bottom') # 下
tk.Label(root, text='P', fg='red').pack(side='left') # 左
tk.Label(root, text='P', fg='red').pack(side='right') # 右
```
### 3. Place
+ 給精確的座標來定位,如此處給的(50, 100),就是將這個部件放在座標為(x=50, y=100)的這個位置, 後面的引數 anchor='nw',就是前面所講的錨定點是西北角。例如:
```gherkin=
tk.Label(root, text='Pl', font=('Arial', 20), ).place(x=50, y=100, anchor='nw')
```
:::info
:::
###### tags: `GUI` `tkinter` `python`