目錄
一、tkinter庫介紹
二、tkinter常用控件介紹
三、tkinter布局方式
1. tkinter布局方式表
2 .grid()方法詳解
四、canvas畫布
1. canvas屬性方法表
2. 代碼執行個體(小房子)
五、tkinter應用程式開發基本流程
六、tkinter代碼執行個體示範
一、tkinter庫介紹
Python标準庫tkinter是對Tcl/Tk的進一步封裝,是一套完整的GUI開發子產品的組合或套件,這些子產品共同提供了強大的跨平台GUI程式設計的功能,所有的源碼檔案位于Python安裝目錄中lib\tkinter檔案夾。
tkinter與turtle類似,無需額外安裝,使用起來非常友善。tkinter提供了很多控件和消息事件,可以很快入手,非常适合開發具有界面的輕量級應用程式。使用tkinter之前,需要導入tkinter子產品:
import tkinter
二、tkinter常用控件介紹
tkinter中的控件就是一些已經封裝好的界面單元,可以直接使用,再複雜的應用程式都是由一個個控件單元組成。隻要掌握了單個控件的使用方法,應用程式就可以如搭積木般建立出來。
(有感而發:想到老子的一句話:“道生一,一生二,二生三,三生萬物。”)
控件名稱 | 說明 |
Button | 按鈕,在界面中顯示一個按鈕 |
Canvas | 畫布,用于繪制直線、橢圓、多邊形等各種圖形 |
Checkbutton | 複選框形式的按鈕,用于在界面中提供多項選擇功能,選擇間沒有互斥關系 |
Radiobutton | 單選按鈕,同一組中的單選鈕任何時刻隻能有一個處于選中狀态 |
Entry | 單行文本框 |
Text | 多行文本框 |
Frame | 架構,可作為其他元件的容器,常用來對元件進行分組 |
Label | 标簽,常用來顯示單行文本 |
Listbox | 清單框 |
Menu | 菜單,用于顯示菜單欄,包括下拉菜單和彈出菜單 |
Message | 消息控件,可以根據自身大小将文本換行 |
Scale | 滑動控件,顯示一個數值刻度,為輸出限定範圍和數字之間,可以通過滑鼠拖動改變數值 |
Scrollbar | 滾動條控件,當内容超出可視化區域時使用 |
Toplevel | 容器控件,常用來建立新的視窗 |
Spinbox | 輸入控件,與Entry類似,但是可以指定輸入數值範圍 |
PanedWindow | 視窗布局管理插件,可以包含一個或多個子控件 |
LabelFrame | 簡單的容器控件,在複雜的視窗布局中使用 |
tkMessageBox | 彈出消息框控件 |
三、tkinter布局方式
1. tkinter布局方式表
布局 | 參數 | 描述 |
pack | after | 将元件放置于其他元件後面 |
before | 将元件放置于其他元件前面 | |
anchor | 元件的對齊方式:N(下/南)對齊,S(上/北)對齊,w(左/西)對齊,E(右/東)對齊 | |
side | 元件相對于主視窗的位置:TOP(上方),BOTTOM(下方),LEFT(左側),RIGHT(右側) | |
fill | 填充方式,X:水準填充,Y:垂直填充 | |
grid | row | 指定元件所在行 |
column | 指定元件所在列 | |
rowspan | 跨越(合并)的行數 | |
columnspan | 跨越(合并)的列數 | |
sticky | 這個參數用來确定:在插件正常尺寸下,如何配置設定 單元 中多餘的空間 | |
place | anchor | 元件的對齊方式:N(下/南)對齊,S(上/北)對齊,w(左/西)對齊,E(右/東)對齊 |
x | 元件左上角的x坐标 | |
y | 元件左上角的y坐标 | |
relx | 元件相對于視窗的x坐标,取值為0~1 | |
rely | 元件相對于視窗的y坐标,取值為0~1 | |
width | 元件寬度 | |
height | 元件高度 | |
relwidth | 元件相對于視窗的寬度,取值為0~1 | |
relheight | 元件相對于視窗的高度,取值為0~1 |
2 .grid()方法詳解
以下語句可以在你的應用界面顯示 w 插件:
w.grid(option=value , ...)
這個方法使用 grid 結構管理器,登記了 w 插件。如果沒有這條語句,将不會在螢幕中顯示這個插件,而隻存在于代碼中。語句中的 option 項可檢視下表,.grid() 結構管理器的參數。
option | 解釋 |
---|---|
column | 插件布放的列數值,從0開始。預設值為0 |
columnspan | 正常情況下,一個插件隻占一個單元 。但是,你可以通過設定 columnspan 來合并一行中的多個鄰近 單元 ,并用此 單元 放置本插件。比如, ,這會把插件 w 布置在 将第0行的2,3,4列合并後的 單元 中。 |
in_ | 用 可以将 w 登記為 w2 的child插件。 w2 必須是 w 建立時指定parent插件的child插件。 |
ipadx | x方向的内部填充。在插件内部,左右方向各填充指定長度的空間。 |
ipady | y方向的内部填充。在插件内部,上下方向各填充指定長度的空間。 |
padx | x方向的外部填充。在插件外部,左右方向各填充指定長度的空間。 |
pady | y方向的内部填充。在插件内部,上下方向各填充指定長度的空間。 |
row | 插件布放的行數值,從0開始。預設值 為 未布放行 的下一個數值。 |
rowspan | 正常情況下,一個插件隻占一個單元 。但是,你可以通過設定 rowspan 來合并一列中的多個鄰近 單元 ,并用此 單元 放置本插件。比如, ,這會把插件 w 布置在 合并了20個 單元 的區域中,也就是3-6行和2-6列。 |
sticky | 這個參數用來确定:在插件正常尺寸下,如何配置設定 單元 中多餘的空間。具體如下。 |
- 如果沒有聲明sticky屬性,預設将插件居中于 單元 中。
- 通過設定
(靠右上方),sticky=tk.NE
(靠右下方),sticky=tk.SE
(靠左下方),sticky=tk.SW
(靠左上方),可以将插件布置在 單元 的某個角落。sticky=tk.NW
- 通過設定
(靠上方),sticky=tk.N
(靠右方),sticky=tk.E
(靠下方),sticky=tk.S
(靠左方),可以将插件布置在 單元 的某個方向上。sticky=tk.W
- 通過設定
,在垂直方向上延伸插件,并保持水準居中。sticky=tk.N+tk.S
- 通過設定
,在水準方向上延伸插件,并保持垂直居中。sticky=tk.E+tk.W
- 通過設定
,在水準和垂直方向上延伸插件,填滿 單元 。sticky=tk.N+tk.E+tk.W
- 也可以使用其他的組合。比如,
,在垂直方向上延伸插件,并靠左布放。sticky=tk.N+tk.S+tk.W
注:.grid()方法翻譯自新墨西哥理工大學計算機中心
四、canvas畫布
1. canvas屬性方法表
屬性和方法 | 說明 | |
控制參數 | background,簡稱bg | 背景色 |
foreground,簡稱fg | 前景色 | |
borderwidth | 邊框寬度 | |
width | 寬度 | |
height | 高度 | |
bitmap | 位圖 | |
image | 圖檔 | |
方法 | create_arc | 繪制圓弧 |
create_bitmap | 繪制位圖,支援xbmn格式 | |
create_image | 繪制圖檔,支援gif格式 | |
create_line | 繪制直線 | |
create_oval | 繪制橢圓 | |
create_ploygon | 繪制多邊形 | |
create_rectangle | 繪制矩形 | |
create_text | 繪制文本框 | |
create_window | 繪制視窗 | |
delete | 删除繪制的圖形 | |
itemconfig | 修改圖形屬性 | |
move | 移動圖形,如move(1,4,5),1為圖像對象辨別,4為水準移動像素,5為垂直移動像素 | |
coords | 重新設定圖形位置 | |
update | 重新整理畫布 |
2. 代碼執行個體(小房子)
代碼執行個體
# coding=utf-8
import tkinter as tk # 導入tkinter子產品
root = tk.Tk() # 建立一個頂級視窗
root.title('小房子1') # 設定标題
canvas = tk.Canvas(root, bg='white', width=700, height=700) # 在root視窗上建立畫布canvas,白色背景,寬和高均為700像素
canvas.pack(anchor='center') # canvas在root上居中顯示
points = [(50, 250), (350, 50), (650, 250)] # 三角形頂點坐标位置
canvas.create_polygon(points, fill='gray', outline='black', width=10) # 白色填充,紅色線條,線寬為10
canvas.create_rectangle((200, 250, 500, 550),
fill='white', outline='black', width=10) # 繪制矩形,白色填充,綠色線條,線寬為10
canvas.create_oval((250, 300, 450, 500),
fill='yellow', outline='black', width=10) # 繪制圓形,黃色填充,黃色線條,線寬為10
root.mainloop() # 進入消息循環
運作結果
五、tkinter應用程式開發基本流程
- 編寫通用代碼,例如資料庫操作、程式中需要多次調用的函數,這需要在編寫代碼之間對軟體的功能進行分析和整理,最終提煉出通用部分的代碼封裝成類或函數。
- 搭建界面,放置菜單、标簽、按鈕、輸入框、選擇框等元件,設定元件屬性。
- 編寫元件的事件處理代碼。
# 根據需要導入需要的子產品
import tkinter
import tkinter.ttk
import tkinter.messagebox
import tkinter.simpledialog
# 這裡編寫通用代碼,或單獨放置到另外的子產品中再導入
# 建立tkinter應用程式主視窗
root = tkinter.Tk()
# 此處編寫設定視窗屬性的代碼
# 此處編寫建立視窗上各種元件的代碼
# 以及按鈕、組合框等互動式元件的事件代碼
# 啟動消息主循環,啟動應用程式
root.mainloop()
六、tkinter代碼執行個體示範
個人介紹頁面代碼展示
#coding = utf-8
from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox
'''全局變量的定義'''
# 頂層視窗
root = None
# 姓名和密碼Entry控件
entry_name, entry_pwd = None, None
# 性别、學曆控件綁定的值
sex, education = None, None
# 音樂、舞蹈控件綁定的值
music, dance = None, None
# 個人介紹Text控件綁定的值
text_remark = None
def radiobutton_clicked():
'''
Radiobutton單選按鈕控件點選觸發事件
:return:
'''
global sex
print("sex : " + str(sex.get()))
def checkbutton_clicked():
'''
Checkbutton多選按鈕點選觸發事件
:return:
'''
global music, dance
print("music : " + str(music.get()))
print("dance : " + str(dance.get()))
def printInfo():
'''
擷取和列印頁面資訊
:return:
'''
print("submit is called......")
global entry_name, entry_pwd, text_remark, \
sex, music, dance, education
print('name : %s' % (entry_name.get()))
print('pwd : %s' % (entry_pwd.get()))
print('remark : %s' % (text_remark.get('0.0', 'end')))
print('sex : %s' % (sex.get()))
print('pwd : %s' % (entry_pwd.get()))
print("education : %s" % (education.get()))
def close():
'''
關閉視窗
:return:
'''
print("close is called......")
global root
root.quit()
def showDlg():
'''
顯示對話框
:return:
'''
global entry_name
messagebox.showinfo(title='對話框事例', message=entry_name.get())
def createUI():
'''
建立視窗和控件
:return:
'''
global root, entry_name, entry_pwd, sex, \
education, music, dance, text_remark
root = Tk()
root.title("Register")
sex = IntVar()
music = IntVar()
dance = IntVar()
sex.set(1) # 1:男性, 2:女性
music.set(1) # 1:選中, 0:不選中
dance.set(0) # 1:選中, 0:不選中
# frame_head,其父視窗為root
frame_head = Frame(root)
frame_head.pack(side=TOP, fill=BOTH, expand=YES)
# frame_account,其父視窗為frame_head
frame_account = Frame(frame_head)
frame_account.grid(row=0, column=0)
label_name = Label(frame_account, text='姓名:', width=10)
label_name.grid(row=0, column=0, padx=10, pady=5)
entry_name = Entry(frame_account, foreground='blue', width=28)
entry_name.insert(0, '簡時刻')
#entry_name.delete(3, END)
entry_name.grid(row=0, column=1, padx=10, pady=5)
label_pwd = Label(frame_account, text='密碼:', width=10)
label_pwd.grid(row=1, column=0, padx=10, pady=5)
entry_pwd = Entry(frame_account, show="*",foreground='red', width=28)
entry_pwd.insert(0, '123456')
entry_pwd.grid(row=1, column=1, padx=10, pady=5)
label_sex = Label(frame_account, text='性别:', width=10)
label_sex.grid(row=2, column=0, padx=10, pady=5)
frame_sex = Frame(frame_account)
frame_sex.grid(row=2, column=1, padx=10, pady=5)
# 1:選中, 0:不選中
radio_btn_m = Radiobutton(frame_sex, variable=sex, text='男', value=1,
command=radiobutton_clicked)
radio_btn_m.grid(row=0, column=0, padx=20, pady=5)
radio_btn_f = Radiobutton(frame_sex, variable=sex, text='女', value=2,
command=radiobutton_clicked)
radio_btn_f.grid(row=0, column=1, padx=20, pady=5)
# frame_image,其父視窗為frame_head
frame_image= Frame(frame_head)
frame_image.grid(row=0, column=1)
bm = PhotoImage(file="男孩.png")
label_image = Label(frame_image,image=bm)
label_image.bm = bm
label_image.grid(row=0,column=1, padx=10, pady=5)
# frame_info,其父視窗為root
frame_info = Frame(root)
frame_info.pack(side=TOP, fill=BOTH, expand=YES)
label_education = Label(frame_info, text='學曆:', width=10)
label_education.grid(row=1, column=0, padx=10, pady=5)
education = StringVar()
comb_education = Combobox(frame_info,
textvariable=education, width=40)
comb_education.grid(row=1, column=1, padx=10, pady=5)
comb_education['value'] = ['專科','大學','碩士','博士']
comb_education.current(2)
label_hobby = Label(frame_info, text='愛好:', width=10)
label_hobby.grid(row=2, column=0, padx=10, pady=5)
frame_hobby = Frame(frame_info, width=40)
frame_hobby.grid(row=2, column=1, padx=10, pady=5)
check_btn_music = Checkbutton(frame_hobby, text='程式設計',
variable=music,
command=checkbutton_clicked)
check_btn_music.grid(row=0, column=0, padx=20, pady=5)
check_btn_dance = Checkbutton(frame_hobby, text='閱讀',
variable=dance,
command=checkbutton_clicked)
check_btn_dance.grid(row=0, column=1, padx=20, pady=5)
check_btn_music = Checkbutton(frame_hobby, text='遊戲',
variable=music,
command=checkbutton_clicked)
check_btn_music.grid(row=0, column=2, padx=20, pady=5)
# frame_remark,其父視窗是root
frame_remark = Frame(root)
frame_remark.pack(side=TOP, fill=BOTH, expand=YES)
text_remark = Text(frame_remark, width=55,
height=5, foreground='green')
text_remark.insert(1.0, '1. 簡時刻就讀于廣州大學教育技術學專業\n')
text_remark.insert(2.0, '2. 大二參加網際網路比賽以及挑戰杯\n')
text_remark.insert(3.0, '3. 大三考取計算機二級office、python和教師資格證書\n')
text_remark.insert(4.0, '4. 目前正在學習Python,水準菜鳥入門級')
text_remark.grid(row=0, column=0, padx=10, pady=5)
# frame_btn,其父視窗為root
frame_btn = Frame(root, width=40)
frame_btn.pack(side=BOTTOM, fill=BOTH, expand=YES)
btn_submit = Button(frame_btn, text='擷取資訊', command=printInfo)
btn_submit.grid(row=0, column=0, padx=20, pady=10)
btn_quit = Button(frame_btn, text='關閉視窗', command=close)
btn_quit.grid(row=0, column=1, padx=20, pady=10)
btn_dlg = Button(frame_btn, text='對話框', command=showDlg)
btn_dlg.grid(row=0,column=2, padx=20, pady=10)
root.mainloop()
if __name__ == '__main__':
createUI()
運作結果