tkinter介紹
tkinter是python自帶的GUI庫,是對圖形庫TK的封裝
tkinter是一個跨平臺的GUI庫,開發的程式可以在win,linux或者mac下運行
組件概念
一個視窗中任意內容都可以稱之為一個組件
tkinter的組件包含以下幾種
當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎么去學習呢? 學習Python中有不明白推薦加入交流Q群號:928946953 群里有志同道合的小伙伴,互幫互助, 群里有不錯的視頻學習教程和PDF! 還有大牛解答!
按鈕組件
復制代碼 隱藏代碼
Button 按鈕組件
RadioButton 單選框組件
CheckButton 選擇按鈕組件
Listbox 串列框組件
文本輸入框組件
復制代碼 隱藏代碼
Entry 單行文本框組件
Text 多行文本框組件
標簽組件
復制代碼 隱藏代碼
Label 標簽組件,可以顯示圖片和文字
Message 標簽組件,可以根據內容將文字換行
選單組件
復制代碼 隱藏代碼
Menu 選單組件
MenuButton 選單按鈕組件,可以使用Menu代替
滾動條組件
復制代碼 隱藏代碼
scale 滑塊組件
Scrollbar 滾動條組件
其他組件
復制代碼 隱藏代碼
Canvas 畫布組件
Frame 框架組件,將多個組件編組
Toplevel 創建子視窗容器組件
創建視窗
簡單的視窗
復制代碼 隱藏代碼
import tkinter
# 創建一個主視窗
win = tkinter.Tk()
# 設定標題
win.title("Python-14")
# 設定視窗大小和位置
# 500x500 表示視窗大小
# +200+50 表示視窗距離電腦螢屏的左邊緣和上邊緣的距離
win.geometry("500x500+200+50")
# 啟動主視窗
win.mainloop()
帶有組件的視窗
復制代碼 隱藏代碼
import tkinter
#生成主視窗物件
root = tkinter.Tk()
#創建標簽 并且添加到主視窗中
label = tkinter.Label(root,text = '爺來了')
label.pack()
#創建按鈕,并且添加到主視窗中
btn1 = tkinter.Button(root,text = '按鈕1')
btn1.pack()
btn2 = tkinter.Button(root,text = '按鈕2')
btn2.pack()
#保持主視窗一直訊息回圈中,,
root.mainloop()
組件布局
組件布局一共三種方式
復制代碼 隱藏代碼
pack() 按照方位布局
place() 按照坐標布局
grid() 按照網格布局
1.pack布局方法
所有的Tkinter組件都包含專用的幾何管理方法,這些方法是用來組織和管理整個父配件區中子配件的布局的,Tkinter提供了截然不同的三種幾何管理類:pack、grid和place,
pack幾何管理采用塊的方式組織配件,在快速生成界面設計中廣泛采用,若干組件簡單的布局,采用pack的代碼量最少,pack幾何管理程式根據 組件創建生成的順序將組件添加到父組件中去,通過設定相同的錨點(anchor)可以將一組配件緊挨一個地方放置,如果不指定任何選項,默認在父表單中自頂向下添加組件,
pack()布局的通用公式
復制代碼 隱藏代碼
組件物件.pack(設定, …)
|
名稱 |
描述 |
取值范圍 |
|
expand |
當值為“yes”時,side選項無效,組件顯示在父配件中心位置;若fill選項為”both”,則填充父組件的剩余空間, |
“yes”, 自然數, “no”, 0(默認值為“no”或0) |
|
fill |
填充x(y)方向上的空間,當屬性side=”top”或”bottom”時,填充x方向;當屬性side=”left”或”right”時,填充”y”方向;當expand選項為”yes”時,填充父組件的剩余空間, |
“x”, “y”, “both”(默認值為待選) |
|
ipadx, ipady |
組件內部在x(y)方向上填充的空間大小,默認單位為像素,可選單位為c(厘米)、m(毫米)、i(英寸)、p(列印機的點,即1/27英寸),用法為在值后加以上一個后綴既可, |
非負浮點數(默認值為0.0) |
|
padx, pady |
組件外部在x(y)方向上填充的空間大小,默認單位為像素,可選單位為c(厘米)、m(毫米)、i(英寸)、p(列印機的點,即1/27英寸),用法為在值后加以上一個后綴既可, |
非負浮點數(默認值為0.0) |
|
side |
定義停靠在父組件的哪一邊上, |
“top”, “bottom”, “left”, “right”(默認為”top”) |
|
before |
將本組件于所選組建物件之前pack,類似于先創建本組件再創建選定組件, |
已經pack后的組件物件 |
|
after |
將本組件于所選組建物件之后pack,類似于先創建選定組件再本組件, |
已經pack后的組件物件 |
|
in_ |
將本組件作為所選組建物件的子組件,類似于指定本組件的master為選定組件, |
已經pack后的組件物件 |
|
anchor |
相對于擺放組件的位置的對齊方式,左對齊”w”,右對齊”e”,頂對齊”n”,底對齊”s” |
“n”, “s”, “w”, “e”, “nw”, “sw”, “se”, “ne”, “center”(默認為” center”) |
注:以上選項中可以看出expand、fill和side是相互影響的,
pack類提供了下列函式
|
函式名 |
描述 |
|
slaves() |
以串列方式回傳本組件的所有子組件物件, |
|
propagate(boolean) |
設定為True表示父組件的幾何大小由子組件決定(默認值),反之則無關, |
|
info() |
回傳pack提供的選項所對應得值, |
|
forget() |
Unpack組件,將組件隱藏并且忽略原有設定,物件依舊存在,可以用pack(option, …),將其顯示, |
|
location(x, y) |
x, y為以像素為單位的點,函式回傳此點是否在單元格中,在哪個單元格中,回傳單元格行列坐標,(-1, -1)表示不在其中, |
|
size() |
回傳組件所包含的單元格,揭示組件大小, |
2.grid布局方法
grid幾何管理采用類似表格的結構組織配件,使用起來非常靈活,用其設計對話框和帶有滾動條的表單效果最好,grid采 用行列確定位置,行列交匯處為一個單元格,每一列中,列寬由這一列中最寬的單元格確定,每一行中,行高由這一行中最高的單元格決定,組件并不是充滿整個單 元格的,你可以指定單元格中剩余空間的使用,你可以空出這些空間,也可以在水平或豎直或兩個方向上填滿這些空間,你可以連接若干個單元格為一個更大空間, 這一操作被稱作跨越,創建的單元格必須相臨,
grid()布局的通用公式為
復制代碼 隱藏代碼
組件物件.grid(option, …)
grid類提供了下列設定屬性
|
名稱 |
描述 |
取值范圍 |
|
column |
組件所置單元格的列號, |
自然數(起始默認值為0,而后累加) |
|
columnspan |
從組件所置單元格算起在列方向上的跨度, |
自然數(起始默認值為0) |
|
ipadx, ipady |
組件內部在x(y)方向上填充的空間大小,默認單位為像素,可選單位為c(厘米)、m(毫米)、i(英寸)、p(列印機的點,即1/27英寸),用法為在值后加以上一個后綴既可, |
非負浮點數(默認值為0.0) |
|
padx, pady |
組件外部在x(y)方向上填充的空間大小,默認單位為像素,可選單位為c(厘米)、m(毫米)、i(英寸)、p(列印機的點,即1/27英寸),用法為在值后加以上一個后綴既可, |
非負浮點數(默認值為0.0) |
|
row |
組件所置單元格的行號, |
自然數(起始默認值為0,而后累加) |
|
rowspan |
從組件所置單元格算起在行方向上的跨度, |
自然數(起始默認值為0) |
|
in_ |
將本組件作為所選組建物件的子組件,類似于指定本組件的master為選定組件, |
已經pack后的組件物件 |
|
sticky |
組件緊靠所在單元格的某一邊角, |
“n”, “s”, “w”, “e”, “nw”, “sw”, “se”, “ne”, “center”(默認為” center”) |
grid類提供了下列函式
|
函式名 |
描述 |
|
slaves() |
以串列方式回傳本組件的所有子組件物件, |
|
propagate(boolean) |
設定為True表示父組件的幾何大小由子組件決定(默認值),反之則無關, |
|
info() |
回傳pack提供的選項所對應得值, |
|
forget() |
Unpack組件,將組件隱藏并且忽略原有設定,物件依舊存在,可以用pack(option, …),將其顯示, |
|
grid_remove() |
從網格管理器中洗掉此小部件,小部件不會被銷毀,并且可以由網格或任何其他管理器重新顯示, |
3.place布局方法
這個的幾何管理器組織放置在一個特定的位置,在他們的父widget部件.
place()布局的通用公式為:
復制代碼 隱藏代碼
組件物件.place(option, …)
|
名稱 |
描述 |
取值范圍 |
|
anchor |
相對于擺放組件的坐標的位置 |
請參閱:可能是N,E,S,W,東北,西北,東南或西南,羅盤方向指示的widget的角落,雙方默認是凈重(部件上左上角) |
|
height |
以像素為單位的高度.(絕對布局專用) |
像素 |
|
width |
以像素為單位的寬度.(絕對布局專用) |
像素 |
|
relheight |
組件相對于視窗的的高度(相對布局專用) |
0~1 |
|
relwidth |
組件相對于視窗的的寬度(相對布局專用) |
0~1 |
|
relx |
水平偏移為0.0和1.0之間浮動,父widget的一小部分的高度和寬度.(相對布局專用) |
0~1 |
|
rely |
垂直偏移為0.0和1.0之間浮動,父widget的一小部分的高度和寬度.(相對布局專用) |
0~1 |
|
x |
組件距離左上角的x坐標(絕對布局專用) |
像素 |
|
y |
組件距離左上角的y坐標(絕對布局專用) |
像素 |
place類提供了下列函式(使用組件實體物件呼叫)
|
函式名 |
描述 |
|
place_slaves() |
以串列方式回傳本組件的所有子組件物件, |
|
place_configure(option=value) |
給pack布局管理器設定屬性,使用屬性(option)= 取值(value)方式設定 |
|
propagate(boolean) |
設定為True表示父組件的幾何大小由子組件決定(默認值),反之則無關, |
|
place_info() |
回傳pack提供的選項所對應得值, |
|
grid_forget() |
Unpack組件,將組件隱藏并且忽略原有設定,物件依舊存在,可以用pack(option, …),將其顯示, |
|
location(x, y) |
x, y為以像素為單位的點,函式回傳此點是否在單元格中,在哪個單元格中,回傳單元格行列坐標,(-1, -1)表示不在其中 |
|
size() |
回傳組件所包含的單元格,揭示組件大小, |
組件介紹
組件1 按鈕(button)
用于定義GUI界面中的按鈕組件
復制代碼 隱藏代碼
tkinter.Button(用于存放的父組件,屬性引數...)
具備以下屬性
復制代碼 隱藏代碼
anchor 設定按鈕中文字的對齊方式,相對于按鈕的中心位置
background(bg) 設定按鈕的背景顏色
foreground(fg) 設定按鈕的前景色(文字的顏色)
borderwidth(bd) 設定按鈕邊框寬度
cursor 設定滑鼠在按鈕上的樣式
command 設定按鈕點擊時觸發的函式
bitmap 設定按鈕上顯示的位圖
font 設定按鈕上文本的字體
width 設定按鈕的寬度 (字符個數)
height 設定按鈕的高度 (字符個數)
state 設定按鈕的狀態
text 設定按鈕上的文字
image 設定按鈕上的圖片
復制代碼 隱藏代碼
import tkinter
# 創建一個主視窗
win = tkinter.Tk()
# 設定標題
win.title("Python-14")
# 設定視窗大小和位置
# 500x500 表示視窗大小
# +200+50 表示視窗距離電腦螢屏的左邊緣和上邊緣的距離
win.geometry("500x500+200+50")
button1 = tkinter.Button(win,
text = "退出",
width = 20,
height = 5,
command = win.quit
)
button1.pack()
def func():
print("歡迎歡迎!")
button2 = tkinter.Button(win,
text = "點我有驚喜",
width = 30,
height = 20,
command = func
)
button2.pack()
# 啟動主視窗
win.mainloop()
組件2 文本框(Entry)和多行文本(Text)
用于定義頁面中文本的單行輸入框
復制代碼 隱藏代碼
#單行文本
tkinter.Entry(用于存放的父組件,屬性引數...)
#多行文本
tkinter.Text(用于存放的父組件,屬性引數...)
具備以下屬性
復制代碼 隱藏代碼
background(bg) 設定文本框的背景色
foreground(fg) 設定文本框的前景色
borderwidth(bd) 設定文本輸入框的邊框
font 設定文本框中的字體
width 設定文本框的寬度(字符個數)
height 設定文本框的高度(字符個數),僅限于text
state 設定文本框的狀態
selectbackground 選中文字時文本框的背景色
selectforeground 選中文字時文字的顏色
show 指定文本框顯示的字符,若為*,則表示為密碼框
textvariable 設定文本對應的變數,可以通過修改變數改變文字顯示,必須使用tkinter.IntVar() 或 tkinter.StringVar()產生的變數 entry可以使用
復制代碼 隱藏代碼
import tkinter
# 創建一個主視窗
win = tkinter.Tk()
# 設定標題
win.title("Python-14")
# 設定視窗大小和位置
win.geometry("500x500+250+150")
# 設定一個變數,用來接收輸入控制元件得內容
e1 = tkinter.Variable()
# 輸入框控制元件
# show 隱藏輸入的內容
entry = tkinter.Entry(win,textvariable = e1,show = "@")
entry.pack()
# 設定輸入框內默認內容
e1.set("請輸入用戶名")
print(e1.get())
#設定按鈕提交
def func():
print(e1.get())
button = tkinter.Button(win,text = "提交",command = func)
button.pack()
# 啟動主視窗
win.mainloop()
復制代碼 隱藏代碼
import tkinter
win = tkinter.Tk()
win.title("Python-14")
win.geometry("500x500+200+100")
#創建一個滾動條
scroll = tkinter.Scrollbar()
text = tkinter.Text(win,width = 100,height = 40)
#顯示滾動條位置 放在右側 填充滿Y軸
scroll.pack(side = tkinter.RIGHT,fill = tkinter.Y)
# 文本框的顯示
text.pack(side = tkinter.LEFT,fill = tkinter.Y)
#系結滾動條和文本框
scroll.config(command = text.yview)
#系結文本框和滾動條
text.config(yscrollcommand = scroll.set)
str = """
Christmas Day is on December 25th. It was originated in the western country, but today, this festival has been celebrated by the world. For the manufacturers, they are very happy to make this day as a shopping day. I enjoy the great atmosphere.
I had a very special Christmas day last year. I experienced the western style festival. There was a new foreign teacher taught us the lesson. She was about 50 years old and she was very kind and we all liked her. On Christmas Day, she brought us the desserts she made early in the morning. We enjoyed the home-made cakes. What's more, she invited us to came to her house and spent the day with her. Then for the first time, I ate big turkey, which was so delicious. The turkey was filled with many stuffs and the flavor was so good. After dinner, we sang songs and danced. Thanks to my foreign teacher, I experienced the American style festival. It was such funny for me. Though today many people enjoy shopping in all kinds of festivals, the meaning of these festival should be remembered. Christmas Day is on December 25th. It was originated in the western country, but today, this festival has been celebrated by the world. For the manufacturers, they are very happy to make this day as a shopping day. I enjoy the great atmosphere.
"""
text.insert(tkinter.INSERT,str)
win.mainloop()
復制代碼 隱藏代碼
import tkinter
win = tkinter.Tk()
win.title("Python-14")
win.geometry("500x500+200+100")
# 創建一個輸入框
entry = tkinter.Entry(win)
entry.pack()
# 創建一個文本框
text = tkinter.Text(win,width = 50,height = 20)
text.pack()
# 寫一個讀取檔案的函式
def func():
with open(entry.get(),"r") as f:
content = f.read()
text.insert(tkinter.INSERT,content)
# 寫一個保存檔案內容的函式
def func1():
with open(entry.get(),"w") as f:
# 寫入的內容為 文本框內從0行0列到結束
f.write(text.get(0.0,tkinter.END))
#創建兩個按鈕
button1 = tkinter.Button(win,text = "保存",command = func1)
button2 = tkinter.Button(win,text = "讀取",command = func)
button1.pack()
button2.pack()
win.mainloop()
組件3 標簽(Lebal)
標簽用語在頁面中顯示文字或者圖片
復制代碼 隱藏代碼
tkinter.Label(用于存放的父組件,屬性引數...)
具備以下屬性
復制代碼 隱藏代碼
anchor 設定文本相對于標簽中心的位置
background(bg) 設定標簽的背景色
foreground(fg) 設定標簽的前景色
borderwidth(bd) 設定標簽的邊框寬度
width 設定標簽的寬度(字符個數)
height 設定標簽的高度(字符個數)
text 設定標簽中文本內容
font 設定標簽中文字的字體型別
bitmap 設定標簽的現實的位圖
image 設定標簽中顯示的圖片
justify 設定標簽中多行文本的對齊方式
textvariable 設定文本對應的變數,可以通過修改變數改變文字顯示,必須使用tkinter.IntVar() 或者tkinter.StringVar()產生的變數
復制代碼 隱藏代碼
import tkinter
# 創建一個主視窗
win = tkinter.Tk()
# 設定標題
win.title("Python-14")
# 設定視窗大小和位置
# 500x500 表示視窗大小
# +200+50 表示視窗距離電腦螢屏的左邊緣和上邊緣的距離
win.geometry("500x500+200+50")
"""
Label:標簽空間,可以顯示文本
win:主視窗
text:顯示文本內容
bg:背景顏色
fg:字體顏色
font:設定字體和字體大小
wraplength:指定text中多寬之后進行換行
anchor:文本顯示的位置 n北 e東 s南 w西 center居中 ne se sw nw
justify:設定換行之后的對齊方式
"""
label = tkinter.Label(win,
text = "this is a python test",
bg = "red",
fg = "yellow",
font = ("黑體",26),
width = 5,
height = 10,
wraplength = 100,
anchor = "n",
justify = "right"
)
# 顯示標簽
label.pack()
# 啟動主視窗
win.mainloop()
組件4 單選框(Radiobutton)與復選框(Checkbutton)
復制代碼 隱藏代碼
thinter.Radiobutton(用于存放的父組件,屬性引數...)
thinter.Checkbutton(用于存放的父組件,屬性引數...)
具有以下屬性
復制代碼 隱藏代碼
anchor 設定組件中文字的對齊方式
background(bg) 指定組件的背景色,
borderwidth(bd) 指定組件邊框的寬度,
bitmap 指定組件中的位圖,
font 指定組件中文本的字體,
foreground(fg) 指定組件的前
height 指定組件的高度,
image 指定組件中的圖片,
justify 指定組件中多行文本的對齊方式,
text 指定組件中的文本,可以 使用“\ n” 表示換行,
value 指定組件被選中后狀態的值(單選框)
onvalue 組件勾選狀態值(復選框)
offvalue 組件取消勾選狀態的值(復選框)
variable 指定組件所關聯的變數,需要使用tkinter. IntVar()或者tkinter. StringVar()創建的值
width 指定組件的寬度,
command 設定復選框操作的觸發命令(復選框)
復制代碼 隱藏代碼
# 復選框
import tkinter
win = tkinter.Tk()
win.title("Python-14")
win.geometry("500x500+200+100")
def func():
message = ""
if res1.get():
message += "張三\n"
if res2.get():
message += "李四\n"
if res3.get():
message += "王五\n"
# 清除text中所有內容
text.delete(0.0,tkinter.END)
# 把message寫入text中
text.insert(tkinter.INSERT,message)
# 判斷復選框是否被選定 回傳一個bool值
res1 = tkinter.BooleanVar()
# 創建一個復選框
check1 = tkinter.Checkbutton(win,text = "張三",variable = res1)
check1.pack()
res2 = tkinter.BooleanVar()
check2 = tkinter.Checkbutton(win,text = "李四",variable = res2)
check2.pack()
res3 = tkinter.BooleanVar()
check3 = tkinter.Checkbutton(win,text = "王五",variable = res3)
check3.pack()
# 創建一個文本框
text = tkinter.Text(win,width = 50,height = 20)
text.pack()
# 創建一個按鈕
button = tkinter.Button(win,text = "submit",width = 10,height = 5,command = func)
button.pack()
win.mainloop()
復制代碼 隱藏代碼
#單選框
import tkinter
win = tkinter.Tk()
win.title("Python-14")
win.geometry("500x500+200+100")
# 獲取單選框的value
res = tkinter.StringVar()
# 定義一個函式 來列印單選框的value值
def func():
print(res.get())
# 創建單選框
radio1 = tkinter.Radiobutton(
win,
text = "張三",
value = https://www.cnblogs.com/pythonQqun200160592/p/1,
variable = res,
command = func
)
radio2 = tkinter.Radiobutton(
win,
text = "李四",
value = https://www.cnblogs.com/pythonQqun200160592/p/2,
variable = res,
command = func
)
radio3 = tkinter.Radiobutton(
win,text = "王五",
value = https://www.cnblogs.com/pythonQqun200160592/p/3,
variable = res,
command = func
)
# 顯示單選框
radio1.pack()
radio2.pack()
radio3.pack()
win.mainloop()
組件5 Frame 框架
復制代碼 隱藏代碼
thinter.Menu(用于存放的父組件,屬性引數...)
具有以下屬性
復制代碼 隱藏代碼
background(bg) 正常的背景顏色顯示在標簽和指示器后面,
borderwidth(bd) 指標周圍邊界的大小,默認值為2像素,
cursor 如果將此選項設定為游標名稱(箭頭,點等),則滑鼠游標將在檢查按鈕上方更改為該模式,
height 新框架的垂直尺寸,
highlightbackground 當框架沒有焦點時,焦點的顏色突出顯示,
highlightcolor 當框架具有焦點時,焦點突出顯示的顏色,
highlightthickness 焦點亮點的厚度,
relief 使用默認值,relief = FLAT,檢查按鈕不會從背景中脫穎而出,您可以將此選項設定為任何其他樣式
width checkbutton的默認寬度取決于所顯示的影像或文字的大小,你可以設定此選項的字符數和checkbutton的,總是有許多字符的空間,
復制代碼 隱藏代碼
#布局
import tkinter
win = tkinter.Tk()
win.title("Pyhton-14")
win.geometry("500x500+200+100")
# 創建一個框架
frame = tkinter.Frame(win)
frame.pack()
# 左邊
frm1 = tkinter.Frame(frame)
lable1 = tkinter.Label(frm1,text = "左上",bg = "red",width = 10,height = 5)
lable2 = tkinter.Label(frm1,text = "左下",bg = "yellow",width = 10,height = 5)
lable1.pack(side = tkinter.TOP)
lable2.pack(side = tkinter.TOP)
frm1.pack(side = tkinter.LEFT)
# 右邊
frm2 = tkinter.Frame(frame)
lable3 = tkinter.Label(frm2,text = "右上",bg = "green",width = 10,height = 5)
lable4 = tkinter.Label(frm2,text = "右下",bg = "blue",width = 10,height = 5)
lable3.pack(side = tkinter.TOP)
lable4.pack(side = tkinter.TOP)
frm2.pack(side = tkinter.RIGHT)
win.mainloop()
復制代碼 隱藏代碼
#絕對定位
import tkinter
win = tkinter.Tk()
win.geometry("500x500+200+100")
lable1 = tkinter.Label(win,text = "小紅",bg = "red",width = 20,height = 10)
lable2 = tkinter.Label(win,text = "小明",bg = "green",width = 20,height = 10)
lable3 = tkinter.Label(win,text = "李雷",bg = "yellow",width = 20,height = 10)
lable1.place(x = 0,y = 0)
lable2.place(x = 370,y = 0)
lable3.place(x = 0,y = 310)
win.mainloop()
復制代碼 隱藏代碼
#相對定位
import tkinter
win = tkinter.Tk()
win.title("Python-14")
win.geometry("500x500+200+100")
label1 = tkinter.Label(win,text = "小紅",bg = "red")
label2 = tkinter.Label(win,text = "小明",bg = "green")
label3 = tkinter.Label(win,text = "李雷",bg = "yellow")
label1.pack(fill = tkinter.Y,side = tkinter.LEFT)
label2.pack(fill = tkinter.Y,side = tkinter.RIGHT)
label3.pack(fill = tkinter.X,side = tkinter.TOP)
label3.pack()
win.mainloop()
復制代碼 隱藏代碼
#表格布局
import tkinter
win = tkinter.Tk()
win.title("Python-14")
win.geometry("500x500+200+100")
lable1 = tkinter.Label(win,text = "小紅",bg = "red")
lable2 = tkinter.Label(win,text = "小黃",bg = "yellow")
lable3 = tkinter.Label(win,text = "小藍",bg = "blue")
lable4 = tkinter.Label(win,text = "小粉",bg = "pink")
# 表格布局
lable1.grid(row = 0,column = 0)
lable2.grid(row = 0,column = 1)
lable3.grid(row = 1,column = 0)
lable4.grid(row = 1,column = 1)
win.mainloop()
事件系結
之前能夠觸發操作的只有2個組件,一個按鈕一個選單的選項卡 command屬性 設定操作對應的函式
滑鼠事件型別
復制代碼 隱藏代碼
<Button-1> 按下了滑鼠左鍵 <ButtonPress-1>
<Button-2> 按下了滑鼠中鍵 <ButtonPress-2>
<Button-3> 按下了滑鼠右鍵 <ButtonPress-3>
<Enter> 滑鼠進入組件區域
<Leave> 滑鼠離開組件區域
<ButtonRelease-1> 釋放了滑鼠左鍵
<ButtonRelease-2> 釋放了滑鼠中鍵
<ButtonRelease-3> 釋放了滑鼠右鍵
<B1-Moion> 按住滑鼠左鍵移動
<B2-Moion> 按住滑鼠中鍵移動
<B3-Moion> 按住滑鼠右鍵移動
<Double-Button-1> 雙擊滑鼠左鍵
<Double-Button-2> 雙擊滑鼠中鍵
<Double-Button-3> 雙擊滑鼠右鍵
<MouseWheel> 滾動滑鼠滾輪
鍵盤事件型別
復制代碼 隱藏代碼
<KeyPress> 表示任何鍵盤按下
<KeyPress-A> 表示按下鍵盤A鍵 A可以設定為其他的按鍵
<Alt-KeyPress-A> 表示同時按下Alt和A鍵 A可以設定為其他的按鍵
<Control-KeyPress-A> 表示同時按下Ctrl和A鍵 A可以設定為其他的按鍵
<Shift-KeyPress-A> 表示同時按下Shift和A鍵 A可以設定為其他的按鍵
<Double-KeyPress-A> 表示雙擊鍵盤A鍵 A可以設定為其他的按鍵
<Lock-KeyPress-A> 表示開啟大寫之后鍵盤A鍵 A可以設定為其他的按鍵
<Alt-Control-KeyPress-A> 表示同時按下alt+Ctrl和A鍵 A可以設定為其他的按鍵
注意:鍵盤事件除了entry和text組件其他組件的事件最好系結在主界面上
事件物件中包含的資訊
復制代碼 隱藏代碼
x,y 當前觸發事件時滑鼠相對觸發事件的組件的坐標值
x_root,y_root 當前觸發事件時滑鼠相對于螢屏的坐標值
char 獲取當前鍵盤事件時按下的鍵對應的字符
keycode 獲取當前鍵盤事件時按下的鍵對應的的ascii碼
type 獲取事件的型別
num 獲取滑鼠按鍵型別 123 左中右
widget 觸發事件的組件
width/height 組件改變之后的大小和configure()相關
視窗和組件相關事件型別
復制代碼 隱藏代碼
Activate 當中組件由不可以用變為可用時 針對于state的變值
Deactivate 當組件由可用變為不可用時觸發
Configure 當組件大小發生變化時觸發
Destory 當組件銷毀時觸發
FocusIn 當組件獲取焦點時觸發 針對于Entry和Text有效
Map 當組件由隱藏變為顯示時觸發
UnMap 當組件由顯示變為隱藏時觸發
Perproty 當視窗屬性發生變化時觸發
事件系結函式
組件.bind('事件型別',事件函式)
復制代碼 隱藏代碼
#為一個組件系結一個操作
組件.bind_class('組件型別','事件型別',事件函式)
復制代碼 隱藏代碼
#為一類組件系結一個操作
#組件型別就是創建組件的方法名 例如按鈕組件:Button
組件.bind_all('事件型別',事件函式)
復制代碼 隱藏代碼
#為所有組件系結一個操作(所有操作都會當作對主界面的操作)
復制代碼 隱藏代碼
import tkinter
win = tkinter.Tk()
win.title("Python-14")
win.geometry("500x500+200+100")
def func(event):
print(event.x,event.y)
button = tkinter.Button(win,text = "按鈕",width = 50,height = 20)
button.bind("<Triple-Button-1>",func)
button.pack()
win.mainloop()
練習
檔案對比
復制代碼 隱藏代碼
import sys
import difflib
# sys.argv : 獲取外部運行時的命令 回傳一個串列
# sys.argv : 獲取外部運行時的命令 回傳一個串列
# print(sys.argv)
#
# file1 = sys.argv[1]
# file2 = sys.argv[2]
# print(file1)
# print(file2)
# difflib
# 創建比對物件 HtmlDiff() 生成一個html檔案
# 比對內容 make_file()
復制代碼 隱藏代碼
import sys
import difflib
# sys.argv : 獲取外部運行時的命令 回傳一個串列
# sys.argv : 獲取外部運行時的命令 回傳一個串列
# print(sys.argv)
# difflib
# 創建比對物件 HtmlDiff() 生成一個html檔案
# 比對內容 make_file()
first_path = sys.argv[1] # 獲取第一個要比對的檔案名稱
next_path = sys.argv[2] # 獲取第二個要比對的檔案名稱
# 分別讀取兩個檔案
with open(first_path,"r") as f:
first_list = f.readlines()
with open(next_path,"r") as f:
next_list = f.readlines()
# 生成比對物件
diff = difflib.HtmlDiff()
html = diff.make_file(first_list,next_list)
with open("diff.html","w") as f:
f.write(html)
復制代碼 隱藏代碼
# win+R cmd cd到檔案當前地址
# python 檔案名.py 檔案1 檔案2
計算器
復制代碼 隱藏代碼
from tkinter import *
root = Tk()
root.geometry('250x380')
root.title('計算器')
frame_show = Frame(width=300,height=150,bg='#dddddd')
#頂部區域
v = StringVar()
v.set('0')
show_label = Label(frame_show,textvariable =v, bg = 'white',width=12,height=1,font=("黑體", 20, "bold"),justify=LEFT,anchor='e')
show_label.pack(padx = 10,pady = 10)
frame_show.pack()
#是否按下了運算子
isopear = False
#操作序列
calc = []
def change(num):
global isopear
if isopear == False:
if v.get() == '0':
v.set('')
v.set(num)
else:
v.set(v.get()+num)
else:
v.set(num)
isopear = False
#運算
def operation(sign):
global isopear
global calc
isopear = True
calc.append(v.get())
if sign == '+':
calc.append('+')
elif sign == '-':
calc.append('-')
elif sign == '*':
calc.append('*')
elif sign == '/':
calc.append('/')
print(calc)
def equal():
global calc
#獲取當前界面的數值準備運算
calc.append(v.get())
print(calc)
#組成運算字串
calcstr = ''.join(calc)
#檢測最后一位是否是運算子,是就洗掉
if calcstr[-1] in '+-*/':
calcstr = calcstr[0:-1]
#print(calcstr)
#運算操作
result = eval(calcstr)
#顯示結果
v.set(result)
calc.clear()
#洗掉操作
def delete():
if v.get() == '' or v.get() == '0':
v.set('0')
return
else:
num = len(v.get())
if num > 1:
strnum = v.get()
strnum = strnum[0:num-1]
v.set(strnum)
else:
v.set('0')
#清空操作
def clear():
global calc
calc = []
v.set('0')
isopear = False
#正負操作
def fan():
strnum = v.get()
if strnum[0] == '-':
v.set(strnum[1:])
elif strnum[0] != '-' and strnum != '0' :
v.set('-'+strnum)
#按鍵區域
frame_bord = Frame(width=400,height=350,bg='#cccccc')
button_del = Button(frame_bord,text = '←',width = 5,height =1,command = delete).grid(row = 0,column = 0)
button_clear = Button(frame_bord,text = 'C',width = 5,height =1,command = clear).grid(row = 0,column = 1)
button_fan = Button(frame_bord,text = '±',width = 5,height =1,command = fan).grid(row = 0,column = 2)
button_ce = Button(frame_bord,text = 'CE',width = 5,height =1,command = clear).grid(row = 0,column = 3)
button_1 = Button(frame_bord,text = '1',width = 5,height =2,command = lambda:change('1')).grid(row = 1,column = 0)
button_2 = Button(frame_bord,text = '2',width = 5,height =2,command = lambda:change('2')).grid(row = 1,column = 1)
button_3 = Button(frame_bord,text = '3',width = 5,height =2,command = lambda:change('3')).grid(row = 1,column = 2)
button_jia = Button(frame_bord,text = '+',width = 5,height =2,command = lambda:operation('+')).grid(row = 1,column = 3)
button_4 = Button(frame_bord,text = '4',width = 5,height =2,command = lambda:change('4')).grid(row = 2,column = 0)
button_5 = Button(frame_bord,text = '5',width = 5,height =2,command = lambda:change('5')).grid(row = 2,column = 1)
button_6 = Button(frame_bord,text = '6',width = 5,height =2,command = lambda:change('6')).grid(row = 2,column = 2)
button_jian = Button(frame_bord,text = '-',width = 5,height =2,command = lambda:operation('-')).grid(row = 2,column = 3)
button_7 = Button(frame_bord,text = '7',width = 5,height =2,command = lambda:change('7')).grid(row = 3,column = 0)
button_8 = Button(frame_bord,text = '8',width = 5,height =2,command = lambda:change('8')).grid(row = 3,column = 1)
button_9 = Button(frame_bord,text = '9',width = 5,height =2,command = lambda:change('9')).grid(row = 3,column = 2)
button_cheng = Button(frame_bord,text = 'x',width = 5,height =2,command = lambda:operation('*')).grid(row = 3,column = 3)
button_0 = Button(frame_bord,text = '0',width = 5,height =2,command = lambda:change('0')).grid(row = 4,column = 0)
button_dian = Button(frame_bord,text = '.',width = 5,height =2,command = lambda:change('.')).grid(row = 4,column = 1)
button_deng = Button(frame_bord,text = '=',width = 5,height =2,command = equal).grid(row = 4,column = 2)
button_chu = Button(frame_bord,text = '/',width = 5,height =2,command = lambda:operation('/')).grid(row = 4,column = 3)
frame_bord.pack(padx = 10,pady = 10)
root.mainloop()
======================
帖子很長,收藏下來必然某天用得到,筆記是我自己整理并一直在使用的,有錯誤請反饋,謝謝,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/298784.html
標籤:Python
