教程地址,感謝!
目錄:
課時一
GUI:用戶交互界面
kinter 介紹
是python自帶的gui庫,對圖形圖像處理庫tk的封裝
自帶用着方便,跨平台,夠用。
其他gui:pythonwin,wxpython,pyQT等等。
導入tkinter 庫:import tkinter
查詢官方幫助:help(tkinter)
概念介紹
- 組件:組成界面的構成內容就是組件。按鈕,文本輸入框,滾動條,列表,菜單等等。
- 窗口:一個軟件的矩形區域。
最簡單的界面
# 導入模塊
import tkinter
# 創建主窗口對象
root = tkinter.T=Tk() # 實例化主體,類
# 將主窗口加入消息循環
root.mainloop()
實現簡單的模塊
# 導入模塊
import tkinter
# 創建主窗口對象
root = tkinter.Tk() # 實例化主體,類
# 設置窗口的大小
root.minsize(300, 300) # 設置窗口的最小大小為200*200px
# 加入一個按鈕的組件
# 先創建一個按鈕組件
btn = tkinter.Button(root, text = '這是按鈕的文本')
# root 表示將這個按鈕放在哪里 (只是在內存中創建了,並沒有擺放)
# 擺放按鈕(最簡單的)
btn.pack()
# 將主窗口加入消息循環
root.mainloop()
組件的擺放方式
- pack()方式 --> 方位擺放方法(上下左右)(不推薦使用)
a. 上(top),下(bottom),左(left),右(right) - grid()方式 --> 網格擺放方法(網格坐標)
a. 把界面變成網格,對網格橫縱坐標編號.告訴坐標就可以把組件放在具體地方.
b. 適合做格子類的東西,計算器 顏色選擇框等. - place()方式 --> 定位擺放方法(具體像素)
a. 也有橫縱坐標單位是像素.告訴離上邊有多遠,離左邊有多遠 即可確定位置 .
b. 適合軟件拖放的架構
pack()方式例子
# pack()方式:
import tkinter
root = tkinter.Tk()
---
# 創建組件
btn1 = tkinter.Button(root, text = '按鈕1')
btn1.pack(sidel = 'top') # side表示放,后面值是上下左右,默認是top
# 如果是多個組件 上摞的 不好用.
# ipadx, ipady : 設置組件的內部間距.
btn1.pack(ipadx = 20, ipady = 20) # 橫軸縱軸各增加20像素的空間.
# padx, pady 表示距離左右上下組件的間距 單位也是px
# fill 填充
btn1.pack(fill = 'x') # 水平方向的最大位置(一整行).
btn1.pack(fill = 'y') # 垂直方向的最大位置(一整列)但是擺放方式必須是左和右.
btn.pack(fill =
# expand 設置side是否失效.
btn1.pack(expand = 'yes') # 按鈕會在中間,占用了所有組件的空間
root.mainloop()
gird() 方式例子
# 網格沒有具體大小,取決於當前組件 最大組件的大小!
import tkinter
root = tkinter.Tk()
root.minsize(500, 500)
btn1 = tkinter.Button(root, text = '按鈕1')
btn1.grid() # 不設置,默認行列為0
btn1.grid(row = 0, column = 0) # 和上面一個意思
btn2 = tkinter.Button(root, text = '按鈕2')
btn2.grid(row = 1, column = 0) # 行1列0
btn3 = tkinter.Button(root, text = '按鈕3')
btn3.grid(row = 0, column = 1) # 行0列1
'''
如果想跨行跨列 有如下兩個參數:
rowspan: 設置跨行數量
cloumnspan: 設置跨列數量
'''
btn0 = tkinter.Button(root, text = '按鈕0')
btn0.grid(row = 2, column = 0, columnspan = 2, ipadx
= 20) #要設置組件的大小
btnd = tkinter.Button(root, text = ' = ')
btnd.grid(row = 0, column = 2, rowspan = 2, ipady
= 20)
root.mainloop()
place方式例子
# 兩組屬性,不可混合使用!!!
# 絕對定位布局
import tkinter
root = tkinter.Tk()
root.minsize(500, 500)
btn1 = tkinter.Button(root, text = '按鈕1')
btn1.place(x = 100, y = 20, width = 50, height = 50)
# 如果不設置組件位置會什么也不出現,但不報錯,因為組件沒有定位所以顯示在看不到的地方了
# x:設置距離左上角的水平長度,y:設置距離左上角的垂直高度.
# width:設置組件所占據的寬度,height:設置組件所占的高度.
# 這種布局方式拉動主窗口,所有的組件都不會動!因為是絕對定位布局,設置多少就是多少!
# 這里所有的單位都是像素
# 相對定位布局。
# 好處是可以隨界面變化而變化。
# relx:設置距離左上角的水平長度的百分比,rely:設置距離左上角的垂直高度的百分比.
# relwidth:設置組件所占據的寬度的百分比,relheight:設置組件所占的高度的百分比.
import tkinter
root = tkinter.Tk()
root.minsize(500, 500)
btn1 = tkinter.Button(root, text = '按鈕1')
btn1.place(relx = 0.2, rely = 0.1, relwidth = 0.1, relheight = 0.1)
# relx:當前組件左邊占整個寬度的百分比,高度同理。
# relwidth:設置當前寬度占整體寬度的10%,高度同理。
# 以上設置都是相對於界面寬度和高度的百分比,可以根據界面的大小而改變(取值是0到1)
root.mainloop()
課時二
官方文檔可以搜索 python tkinter 去官網查詢.
基本(標准)屬性介紹
有tkinter.xxx 這個類的屬性,可以選擇,也可以自己寫參數.
外形尺寸
import tkinter
root = tkinter.Tk()
root.minsize(500, 500) # 所有屬性盡量只用默認像素或者其他字符類的值.
btn1 = tkinter.Button(root, text = '尺寸')
btn1.pack(ipadx = 100, ipady = 200) # 尺寸的絕大部分尺寸的默認單位是像素
root.mainloop()
坐標系
btn1 = tkinter.Button(root, text = '坐標系')
btn1.place(x = 100, y = 50) # 設置坐標系.
顏色
btn1 = tkinter.Button(root, text = '顏色', bg = 'blue')
# bg:按鈕的背景色.
# 可以使用顏色單詞
# 使用hex顏色模式(例子:#ff0000)(#紅色綠色藍色)(也就是十六進制顏色)
btn1.pack()
字體屬性
btn1 = tkinter.Button(root, text = '字體', font = ('黑體',40,'bold','italic'))
# 字體設置以元祖出現,分別是 字體,字號,黑體,斜體等等.
btn1.pack()
錨點
btn1 = tkinter.Button(root, text = '錨點', anchor = 'nw')
# 錨點就是方向的代名詞
# 按照上北下南左東右西 寫簡寫值就可以.
btn1.pack(ipadx = 20, iapdy = 20)
三維效果
btn1 = tkinter.Button(root, text = '三維效果', relief = 'ridge')
# 有幾種效果:flat, raised, sunken, groove, ridge
# relief關鍵字 = 值(字符串)即可
# 也可以用 tkinter.FLAT 替代參數.
btn1.pack(ipadx = 20, iapdy = 20)
位圖
btn1 = tkinter.Button(root, text = '位圖', bitmap = 'error')
# 內置的位圖圖標庫
# bitmap 屬性.
# error gray75 gray50 gray25 gray12 hourglass info guesthead question waring
# 也可以使用自己的位圖文件, .xbm(x位圖)格式的文件都可以用,代替標准位圖名稱,使用字符串@ 后跟.xbm文件的路徑名.
btn1.pack(ipadx = 20, iapdy = 20)
鼠標
# 用的比較少,可以自定義鼠標的各種狀態,庫里自帶,也可以去文檔中查詢
btn1 = tkinter.Button(root, text = '鼠標', cursor = 'heart')
btn1.pack(ipadx = 20, iapdy = 20)
# 如果要設置整個主窗口
root['cursor'] = 'start'
圖片
# 有兩種
# 第一種bmp格式和位圖意思一樣.很少用 略
# 第二種 PhotoImage類
# 支持.gif和.pgm和.ppm格式
# 將圖片設置為圖像推向
long = tkinter.PhotoImage(file = 'long.gif')
btn1 = tkinter.Button(root, text = '圖片', image = long)
btn1.pack()
設置界面大小,幾何字符串
imoprt tkinter
root = tkinter.Tk()
root.geometry('300x400') # 幾何字符串
常用組件
Frame 框架
功能:用來承載放置其他GUI元素,就是一個容器。用來進行區域划分
# 外部的代碼都是重復的省略
frame1 = tkinter.Frame(root, bg = 'black', width = 100, height = 200)
frame1.pack()
frame2 = tkinter.Frame(roott, bg = 'black' , width = 100, height = 200))
frame2.pack()
# 正常情況下是看不到這兩個容器的 因為容器是虛擬的,為了方便可以加一個背景顏色就看到了
# 設定背景顏色后 看到很小的兩個點 是因為虛擬容器的大小是根據它里面的內容決定的
# 我們可以用width和height參數設定容器的大小.
# 下面展示如何在框架中放入內容
# 假設要擺放按鈕
btn1 = tkinter.Button(frame1, text = '按鈕1')
btn1.pack(side = 'left')
btn2 = tkinter.Button(frame1, text = '按鈕2')
btn2.pack(side = 'left')
btn3 = tkinter.Button(frame1, text = '按鈕3')
btn3.pack(side = 'left')
# 背景會根據元素的大小調整,所以背景被覆蓋了,可以在pack的時候用padx屬性設置邊框 就可以顯示出來了
# 放到框架2 里面是一樣的效果
# 但是這樣依然不要用pack方式擺放東西!
Label 標簽
功能:用於顯示不可編輯的文本或圖標,就是界面上‘死’的東西(文字或圖片)
# 外部的代碼都是重復的省略
label = tkinter.Label(root, text = '這是一個標簽') # 擺放文字 各種通用屬性都可以用.但是一樣用的少.
Button 按鈕
功能:點擊時執行一個動作
案例:
import tkinter
root = tkinter.Tk()
root.geometry('300x300') # 設置界面大小,用幾何字符串設置
btn1 = tkinter.Button(root,)
# root: 表示放的父組件未知子
# bg: 背景色
# text: 文本內容
# fg: 前景色
# font: 字體 (元祖方式 看上面)
# command: 單擊按鈕時要調用的函數或方法.
# width 和 height 是使用4字符大小,不推薦用
# justify: 設置多行文本的對其方式.left right 等
# state: 狀態,按鈕能不能點! 用於控制!(active, disabled, normal)
# bd: 邊框粗細.單位像素
# 其他去文檔里查
btn1.pack()
Entry 單行文本輸入框
# 外部的代碼都是重復的省略
username = tkinter.Entry(root)
username.pack()
# 默認20個字符
# 可以自定義 用width屬性設置,注意單位是字符.
# 通用設置都是一樣的
# 如果用密碼要掩碼的話這樣寫
password = tkinter.Entry(root, show = '*')
# show屬性用來顯示你輸入的內容.做安全用
# Entry 可以用state狀態 控制是否可以輸入,或者展示用.'disabled'表示關閉
password.pack()
功能:顯示一行文本,可以輸入的單行文本
Text 多行文本
功能:顯示多行文本,可以輸入的多行文本
Checkbutton 復選框
功能:選擇框,允許用戶選擇或不選擇一個選項
import tkinter
root = tkinter.Tk()
root.geometry('500x500')
checkbutton = tkinter.Checkbutton(root,text = '要顯示的文本') # text 文字是固定的可以這么寫
checkbutton.pack()
# 如果字要改變
# 設置顯示內容tkinter變量
text = tkinter.StringVar() # 創建變量
text.set('同意此價格') # 設置變量(設置用set,如果想要獲取用get)
result = tkinter.Intvar()
checkbutton = tkinter.Checkbutton(root,textvariable = text, variable = result, command = func)
checkbutton.pack()
# vaiable默認是整形,設置復選框勾選與否的值.
# 設置操作checkbutton的方法(也就是勾選后會出發的行為.)
def func():
print(result.get)
# 如果要自定義勾選或者不勾選的值 可以加`onvalue`和`offalue`也就是說得勾選和勾選的值
result = tkinter.Intvar()
checkbutton.pack()
root.mainloop()
Radiobuution 單選框
功能:允許用戶從多個選項中選取一個,就是很多選項只能選擇一個(小圓點)。
Canvas 畫布
功能:提供繪圖功能,(直線,橢圓,多邊形,矩形)可以包含圖形或位圖。
import tkinter
root = tkinter.Tk()
root.geometry('500x500')
canvas = tkinter.Canvas(root, bg = 'white') #新建一個畫布,把它放入主窗口中,並設置背景為白色.
canvas.pack()
# 在畫布中繪制一個長方形,用矩形工具
canvas.create_rectangle(20, 20, 100, 100, fill = 'red', outline = 'yellow')
# 前面數字參數中,前d兩個參數表示開始矩形左上角點的位置(橫軸,縱軸),后面兩個參數表示矩形右下角的距離0軸(初始位置的)距離.
# fill 給畫出的模塊填充顏色
# outline 邊框顏色
root.mainloop()
Listbox 列表框(盒子)
功能:一個選項列表,用戶可以從中選擇。同時展示多個數據.
# 外部的代碼都是重復的省略
# 設置listbox的內容
names = ('呂洋', '任真', '呂恆一')
# 將上面數據轉換為tkinter的字符串變量.
students = tkinter.StringVar(value = names)
listbox = tkinter.Listbox(root, listvariable = students)
listbox.pack()
Menu 菜單
功能:點下菜單按鈕后彈出一個選項列表,用戶可以從中選擇。
# 1. 創建主菜單
bigmenu = tkinter.Menu(root)
# 2. 創建子菜單
filemenu = tkinter.Menu(bigmenu, , tearoff = 0))
# tearoff = 0 關閉菜單飄出來的功能
# 子菜單可以添加功能
filemenu.add_commadn(label = '打開文件', command = 一個函數)
filemenu.add_separator() # 在菜單中加入恆線的功能.
# 3. 將子菜單加入主菜單
bigmenu.add_cascade(label = '文件', menu = filemenu)
# 4. 將主菜單加入界面
root.config(menu) # 在主菜單里配置一個主菜單
Menubutton 菜單按鈕
功能:用來包含菜單的組件(有下拉式,疊層式等等。)按鈕點擊彈出菜單欄.
# 重復的主窗口內容略
menbutton = tkinter.Menubutton(root, text = '選擇內容')
menubutton.pack()
# 先建立一個菜單
menu = tkinter.Menu(menubuttion)
# 添加選項
# 設置變量
sex = tkinter.StringVar()
men.add_radiobutton(label = '男', variable = sex)
men.add_radiobutton(label = '男', variable = sex)
# 將菜單配置到組件
menubutton.config(menu = menu)
OptionMenu 設置菜單
功能:類似下拉列表的效果
# 重復框架內容略
# 創建一個變量用來接收結果
restult = tkinter.StringVar()
result.set('請選擇一個問題') # 設置默認顯示的值
optionmenu - tkinter.OptionMenu(root, restult, '這是一個問題', '這是二個問題', '這是很多問題.')
Message 消息框
功能:類似於標簽,單是可以顯示多行文本
Scale 進度條
功能:線性"滑塊"組件,可設定起始值和結束值,會顯示當前位置的精確值.
Scrollbar 滾動條
功能:對其支持的組件(文本域,畫布,列表框,文本框)提供滾動功能.
Toplevel 頂層組件
功能:類似框架為其他空間提供但單獨的容器.比如點設置新彈出來一個設置界面 就用到這個.
Spinbox 輸入空間
功能:與Entry類似,但是可以指定輸入范圍值.只能輸入指定類型的內容.(數字,小數,文本之類的.)
PanedWindow 窗口布局管理
功能:是一個窗口布局管理的插件,可以包含一個或者多個子控件.
LabelFrame 容器控件
功能:是一個簡單的容器控件.常用用於復雜窗口布局,例如設置界面內容太多可以把相關內容的設置裝在一起.然后寫上說明.
# 外部的代碼都是重復的省略
labelframe = tkinter.LabelFrame(root, text = '常規設置')
labelframe.pack()
# pack內可以用ipadx設置大小
# 也是虛擬框架 要把組件放進去才顯示.
btn1 = tkinter.Button(labelframe, text = '按鈕1')
btn1.pack()
btn2 = tkinter.Button(labelframe, text = '按鈕1')
btn2.pack()
messagebox 消息框
功能:用於顯示你應用程序的消息框.消息框有很多種(消息選擇框,文件存儲框等),可以以后用的時候慢慢查詢.