tkinter介紹
tkinter是python自帶的GUI庫(kù),是對(duì)圖形庫(kù)TK的封裝
tkinter是一個(gè)跨平臺(tái)的GUI庫(kù),開(kāi)發(fā)的程序可以在win,linux或者mac下運(yùn)行
除此之外還存在很多圖形庫(kù),例如
"""
pythonWin 僅適合window的界面編程庫(kù)
wxPython 第三方界面編程庫(kù)
"""
組件概念
一個(gè)窗口中任意內(nèi)容都可以稱(chēng)之為一個(gè)組件
tkinter的組件包含以下幾種
按鈕組件
"""
Button 按鈕組件
RadioButton 單選框組件
CheckButton 選擇按鈕組件
Listbox 列表框組件
"""
文本輸入框組件
"""
Entry 單行文本框組件
Text 多行文本框組件
"""
標(biāo)簽組件
"""
Label 標(biāo)簽組件,可以顯示圖片和文字
Message 標(biāo)簽組件,可以根據(jù)內(nèi)容將文字換行
"""
菜單組件
"""
Menu 菜單組件
MenuButton 菜單按鈕組件,可以使用Menu代替
"""
滾動(dòng)條組件
"""
scale 滑塊組件
Scrollbar 滾動(dòng)條組件
"""
其他組件
"""
Canvas 畫(huà)布組件
Frame 框架組件,將多個(gè)組件編組
Toplevel 創(chuàng)建子窗口容器組件
"""
創(chuàng)建簡(jiǎn)單的窗口
import tkinter
#生成主窗口對(duì)象
root = tkinter.Tk()
#保持主窗口一直消息循環(huán)中。。
root.mainloop()
import tkinter
# 創(chuàng)建一個(gè)主窗口
win = tkinter.Tk()
# 設(shè)置標(biāo)題
win.title("Python-14")
# 設(shè)置窗口大小和位置
# 500x500 表示窗口大小
# +200+50 表示窗口距離電腦屏幕的左邊緣和上邊緣的距離
win.geometry("500x500+200+50")
# 啟動(dòng)主窗口
win.mainloop()
帶有組件的窗口
import tkinter
#生成主窗口對(duì)象
root = tkinter.Tk()
#創(chuàng)建標(biāo)簽 并且添加到主窗口中
label = tkinter.Label(root,text = '爺來(lái)了')
label.pack()
#創(chuàng)建按鈕,并且添加到主窗口中
btn1 = tkinter.Button(root,text = '按鈕1')
btn1.pack()
btn2 = tkinter.Button(root,text = '按鈕2')
btn2.pack()
#保持主窗口一直消息循環(huán)中。。
root.mainloop()
組件布局
組件布局一共三種方式
"""
pack() 按照方位布局
place() 按照坐標(biāo)布局
grid() 按照網(wǎng)格布局
"""
1.pack布局方法
所有的Tkinter組件都包含專(zhuān)用的幾何管理方法,這些方法是用來(lái)組織和管理整個(gè)父配件區(qū)中子配件的布局的。Tkinter提供了截然不同的三種幾何管理類(lèi):pack、grid和place。
pack幾何管理采用塊的方式組織配件,在快速生成界面設(shè)計(jì)中廣泛采用,若干組件簡(jiǎn)單的布局,采用pack的代碼量最少。pack幾何管理程序根據(jù) 組件創(chuàng)建生成的順序?qū)⒔M件添加到父組件中去。通過(guò)設(shè)置相同的錨點(diǎn)(anchor)可以將一組配件緊挨一個(gè)地方放置,如果不指定任何選項(xiàng),默認(rèn)在父窗體中自頂向下添加組件。
pack()布局的通用公式
組件對(duì)象.pack(設(shè)置, …)
| 名稱(chēng) | 描述 | 取值范圍 |
|---|---|---|
| expand | 當(dāng)值為“yes”時(shí),side選項(xiàng)無(wú)效。組件顯示在父配件中心位置;若fill選項(xiàng)為”both”,則填充父組件的剩余空間。 | “yes”, 自然數(shù), “no”, 0(默認(rèn)值為“no”或0) |
| fill | 填充x(y)方向上的空間,當(dāng)屬性side=”top”或”bottom”時(shí),填充x方向;當(dāng)屬性side=”left”或”right”時(shí),填充”y”方向;當(dāng)expand選項(xiàng)為”yes”時(shí),填充父組件的剩余空間。 | “x”, “y”, “both”(默認(rèn)值為待選) |
| ipadx, ipady | 組件內(nèi)部在x(y)方向上填充的空間大小,默認(rèn)單位為像素,可選單位為c(厘米)、m(毫米)、i(英寸)、p(打印機(jī)的點(diǎn),即1/27英寸),用法為在值后加以上一個(gè)后綴既可。 | 非負(fù)浮點(diǎn)數(shù)(默認(rèn)值為0.0) |
| padx, pady | 組件外部在x(y)方向上填充的空間大小,默認(rèn)單位為像素,可選單位為c(厘米)、m(毫米)、i(英寸)、p(打印機(jī)的點(diǎn),即1/27英寸),用法為在值后加以上一個(gè)后綴既可。 | 非負(fù)浮點(diǎn)數(shù)(默認(rèn)值為0.0) |
| side | 定義??吭诟附M件的哪一邊上。 | “top”, “bottom”, “l(fā)eft”, “right”(默認(rèn)為”top”) |
| before | 將本組件于所選組建對(duì)象之前pack,類(lèi)似于先創(chuàng)建本組件再創(chuàng)建選定組件。 | 已經(jīng)pack后的組件對(duì)象 |
| after | 將本組件于所選組建對(duì)象之后pack,類(lèi)似于先創(chuàng)建選定組件再本組件。 | 已經(jīng)pack后的組件對(duì)象 |
| in_ | 將本組件作為所選組建對(duì)象的子組件,類(lèi)似于指定本組件的master為選定組件。 | 已經(jīng)pack后的組件對(duì)象 |
| anchor | 相對(duì)于擺放組件的位置的對(duì)齊方式,左對(duì)齊”w”,右對(duì)齊”e”,頂對(duì)齊”n”,底對(duì)齊”s” | “n”, “s”, “w”, “e”, “nw”, “sw”, “se”, “ne”, “center”(默認(rèn)為” center”) |
注:以上選項(xiàng)中可以看出expand、fill和side是相互影響的。
pack類(lèi)提供了下列函數(shù)
| 函數(shù)名 | 描述 |
|---|---|
| slaves() | 以列表方式返回本組件的所有子組件對(duì)象。 |
| propagate(boolean) | 設(shè)置為T(mén)rue表示父組件的幾何大小由子組件決定(默認(rèn)值),反之則無(wú)關(guān)。 |
| info() | 返回pack提供的選項(xiàng)所對(duì)應(yīng)得值。 |
| forget() | Unpack組件,將組件隱藏并且忽略原有設(shè)置,對(duì)象依舊存在,可以用pack(option, …),將其顯示。 |
| location(x, y) | x, y為以像素為單位的點(diǎn),函數(shù)返回此點(diǎn)是否在單元格中,在哪個(gè)單元格中。返回單元格行列坐標(biāo),(-1, -1)表示不在其中。 |
| size() | 返回組件所包含的單元格,揭示組件大小。 |
2.grid布局方法
grid幾何管理采用類(lèi)似表格的結(jié)構(gòu)組織配件,使用起來(lái)非常靈活,用其設(shè)計(jì)對(duì)話(huà)框和帶有滾動(dòng)條的窗體效果最好。grid采 用行列確定位置,行列交匯處為一個(gè)單元格。每一列中,列寬由這一列中最寬的單元格確定。每一行中,行高由這一行中最高的單元格決定。組件并不是充滿(mǎn)整個(gè)單 元格的,你可以指定單元格中剩余空間的使用。你可以空出這些空間,也可以在水平或豎直或兩個(gè)方向上填滿(mǎn)這些空間。你可以連接若干個(gè)單元格為一個(gè)更大空間, 這一操作被稱(chēng)作跨越。創(chuàng)建的單元格必須相臨。
grid()布局的通用公式為
組件對(duì)象.grid(option, …)
grid類(lèi)提供了下列設(shè)置屬性
| 名稱(chēng) | 描述 | 取值范圍 |
|---|---|---|
| column | 組件所置單元格的列號(hào)。 | 自然數(shù)(起始默認(rèn)值為0,而后累加) |
| columnspan | 從組件所置單元格算起在列方向上的跨度。 | 自然數(shù)(起始默認(rèn)值為0) |
| ipadx, ipady | 組件內(nèi)部在x(y)方向上填充的空間大小,默認(rèn)單位為像素,可選單位為c(厘米)、m(毫米)、i(英寸)、p(打印機(jī)的點(diǎn),即1/27英寸),用法為在值后加以上一個(gè)后綴既可。 | 非負(fù)浮點(diǎn)數(shù)(默認(rèn)值為0.0) |
| padx, pady | 組件外部在x(y)方向上填充的空間大小,默認(rèn)單位為像素,可選單位為c(厘米)、m(毫米)、i(英寸)、p(打印機(jī)的點(diǎn),即1/27英寸),用法為在值后加以上一個(gè)后綴既可。 | 非負(fù)浮點(diǎn)數(shù)(默認(rèn)值為0.0) |
| row | 組件所置單元格的行號(hào)。 | 自然數(shù)(起始默認(rèn)值為0,而后累加) |
| rowspan | 從組件所置單元格算起在行方向上的跨度。 | 自然數(shù)(起始默認(rèn)值為0) |
| in_ | 將本組件作為所選組建對(duì)象的子組件,類(lèi)似于指定本組件的master為選定組件。 | 已經(jīng)pack后的組件對(duì)象 |
| sticky | 組件緊靠所在單元格的某一邊角。 | “n”, “s”, “w”, “e”, “nw”, “sw”, “se”, “ne”, “center”(默認(rèn)為” center”) |
grid類(lèi)提供了下列函數(shù)
| 函數(shù)名 | 描述 |
|---|---|
| slaves() | 以列表方式返回本組件的所有子組件對(duì)象。 |
| propagate(boolean) | 設(shè)置為T(mén)rue表示父組件的幾何大小由子組件決定(默認(rèn)值),反之則無(wú)關(guān)。 |
| info() | 返回pack提供的選項(xiàng)所對(duì)應(yīng)得值。 |
| forget() | Unpack組件,將組件隱藏并且忽略原有設(shè)置,對(duì)象依舊存在,可以用pack(option, …),將其顯示。 |
| grid_remove() | 從網(wǎng)格管理器中刪除此小部件。小部件不會(huì)被銷(xiāo)毀,并且可以由網(wǎng)格或任何其他管理器重新顯示。 |
3.place布局方法
這個(gè)的幾何管理器組織放置在一個(gè)特定的位置,在他們的父widget部件.
place()布局的通用公式為:
組件對(duì)象.place(option, …)
| 名稱(chēng) | 描述 | 取值范圍 |
|---|---|---|
| anchor | 相對(duì)于擺放組件的坐標(biāo)的位置 | 請(qǐng)參閱:可能是N,E,S,W,東北,西北,東南或西南,羅盤(pán)方向指示的widget的角落,雙方默認(rèn)是凈重(部件上左上角) |
| height | 以像素為單位的高度.(絕對(duì)布局專(zhuān)用) | 像素 |
| width | 以像素為單位的寬度.(絕對(duì)布局專(zhuān)用) | 像素 |
| relheight | 組件相對(duì)于窗口的的高度(相對(duì)布局專(zhuān)用) | 0~1 |
| relwidth | 組件相對(duì)于窗口的的寬度(相對(duì)布局專(zhuān)用) | 0~1 |
| relx | 水平偏移為0.0和1.0之間浮動(dòng),父widget的一小部分的高度和寬度.(相對(duì)布局專(zhuān)用) | 0~1 |
| rely | 垂直偏移為0.0和1.0之間浮動(dòng),父widget的一小部分的高度和寬度.(相對(duì)布局專(zhuān)用) | 0~1 |
| x | 組件距離左上角的x坐標(biāo)(絕對(duì)布局專(zhuān)用) | 像素 |
| y | 組件距離左上角的y坐標(biāo)(絕對(duì)布局專(zhuān)用) | 像素 |
place類(lèi)提供了下列函數(shù)(使用組件實(shí)例對(duì)象調(diào)用)
| 函數(shù)名 | 描述 |
|---|---|
| place_slaves() | 以列表方式返回本組件的所有子組件對(duì)象。 |
| place_configure(option=value) | 給pack布局管理器設(shè)置屬性,使用屬性(option)= 取值(value)方式設(shè)置 |
| propagate(boolean) | 設(shè)置為T(mén)rue表示父組件的幾何大小由子組件決定(默認(rèn)值),反之則無(wú)關(guān)。 |
| place_info() | 返回pack提供的選項(xiàng)所對(duì)應(yīng)得值。 |
| grid_forget() | Unpack組件,將組件隱藏并且忽略原有設(shè)置,對(duì)象依舊存在,可以用pack(option, …),將其顯示。 |
| location(x, y) | x, y為以像素為單位的點(diǎn),函數(shù)返回此點(diǎn)是否在單元格中,在哪個(gè)單元格中。返回單元格行列坐標(biāo),(-1, -1)表示不在其中 |
| size() | 返回組件所包含的單元格,揭示組件大小。 |
組件1 按鈕(button)
用于定義GUI界面中的按鈕組件
"""
tkinter.Button(用于存放的父組件,屬性參數(shù)...)
"""
具備以下屬性
"""
anchor 設(shè)置按鈕中文字的對(duì)齊方式,相對(duì)于按鈕的中心位置
background(bg) 設(shè)置按鈕的背景顏色
foreground(fg) 設(shè)置按鈕的前景色(文字的顏色)
borderwidth(bd) 設(shè)置按鈕邊框?qū)挾?cursor 設(shè)置鼠標(biāo)在按鈕上的樣式
command 設(shè)定按鈕點(diǎn)擊時(shí)觸發(fā)的函數(shù)
bitmap 設(shè)置按鈕上顯示的位圖
font 設(shè)置按鈕上文本的字體
width 設(shè)置按鈕的寬度 (字符個(gè)數(shù))
height 設(shè)置按鈕的高度 (字符個(gè)數(shù))
state 設(shè)置按鈕的狀態(tài)
text 設(shè)置按鈕上的文字
image 設(shè)置按鈕上的圖片
"""
import tkinter
# 創(chuàng)建一個(gè)主窗口
win = tkinter.Tk()
# 設(shè)置標(biāo)題
win.title("Python-14")
# 設(shè)置窗口大小和位置
# 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 = "點(diǎn)我有驚喜",
width = 30,
height = 20,
command = func
)
button2.pack()
# 啟動(dòng)主窗口
win.mainloop()
組件2 文本框(Entry)和多行文本(Text)
用于定義頁(yè)面中文本的單行輸入框
"""
#單行文本
tkinter.Entry(用于存放的父組件,屬性參數(shù)...)
#多行文本
tkinter.Text(用于存放的父組件,屬性參數(shù)...)
"""
具備以下屬性
"""
background(bg) 設(shè)置文本框的背景色
foreground(fg) 設(shè)置文本框的前景色
borderwidth(bd) 設(shè)置文本輸入框的邊框
font 設(shè)置文本框中的字體
width 設(shè)置文本框的寬度(字符個(gè)數(shù))
height 設(shè)置文本框的高度(字符個(gè)數(shù)),僅限于text
state 設(shè)置文本框的狀態(tài)
selectbackground 選中文字時(shí)文本框的背景色
selectforeground 選中文字時(shí)文字的顏色
show 指定文本框顯示的字符,若為*,則表示為密碼框
textvariable 設(shè)置文本對(duì)應(yīng)的變量,可以通過(guò)修改變量改變文字顯示。必須使用tkinter.IntVar() 或 tkinter.StringVar()產(chǎn)生的變量 entry可以使用
"""
import tkinter
# 創(chuàng)建一個(gè)主窗口
win = tkinter.Tk()
# 設(shè)置標(biāo)題
win.title("Python-14")
# 設(shè)置窗口大小和位置
win.geometry("500x500+250+150")
# 設(shè)置一個(gè)變量,用來(lái)接收輸入控件得內(nèi)容
e1 = tkinter.Variable()
# 輸入框控件
# show 隱藏輸入的內(nèi)容
entry = tkinter.Entry(win,textvariable = e1,show = "@")
entry.pack()
# 設(shè)置輸入框內(nèi)默認(rèn)內(nèi)容
e1.set("請(qǐng)輸入用戶(hù)名")
print(e1.get())
#設(shè)置按鈕提交
def func():
print(e1.get())
button = tkinter.Button(win,text = "提交",command = func)
button.pack()
# 啟動(dòng)主窗口
win.mainloop()
import tkinter
win = tkinter.Tk()
win.title("Python-14")
win.geometry("500x500+200+100")
#創(chuàng)建一個(gè)滾動(dòng)條
scroll = tkinter.Scrollbar()
text = tkinter.Text(win,width = 100,height = 40)
#顯示滾動(dòng)條位置 放在右側(cè) 填充滿(mǎn)Y軸
scroll.pack(side = tkinter.RIGHT,fill = tkinter.Y)
# 文本框的顯示
text.pack(side = tkinter.LEFT,fill = tkinter.Y)
#綁定滾動(dòng)條和文本框
scroll.config(command = text.yview)
#綁定文本框和滾動(dòng)條
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.
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.
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.
"""
text.insert(tkinter.INSERT,str)
win.mainloop()
import tkinter
win = tkinter.Tk()
win.title("Python-14")
win.geometry("500x500+200+100")
# 創(chuàng)建一個(gè)輸入框
entry = tkinter.Entry(win)
entry.pack()
# 創(chuàng)建一個(gè)文本框
text = tkinter.Text(win,width = 50,height = 20)
text.pack()
# 寫(xiě)一個(gè)讀取文件的函數(shù)
def func():
with open(entry.get(),"r") as f:
content = f.read()
text.insert(tkinter.INSERT,content)
# 寫(xiě)一個(gè)保存文件內(nèi)容的函數(shù)
def func1():
with open(entry.get(),"w") as f:
# 寫(xiě)入的內(nèi)容為 文本框內(nèi)從0行0列到結(jié)束
f.write(text.get(0.0,tkinter.END))
#創(chuàng)建兩個(gè)按鈕
button1 = tkinter.Button(win,text = "保存",command = func1)
button2 = tkinter.Button(win,text = "讀取",command = func)
button1.pack()
button2.pack()
win.mainloop()
組件3 標(biāo)簽(Lebal)
標(biāo)簽用語(yǔ)在頁(yè)面中顯示文字或者圖片
"""
tkinter.Label(用于存放的父組件,屬性參數(shù)...)
"""
具備以下屬性
"""
anchor 設(shè)置文本相對(duì)于標(biāo)簽中心的位置
background(bg) 設(shè)置標(biāo)簽的背景色
foreground(fg) 設(shè)置標(biāo)簽的前景色
borderwidth(bd) 設(shè)置標(biāo)簽的邊框?qū)挾?width 設(shè)置標(biāo)簽的寬度(字符個(gè)數(shù))
height 設(shè)置標(biāo)簽的高度(字符個(gè)數(shù))
text 設(shè)置標(biāo)簽中文本內(nèi)容
font 設(shè)置標(biāo)簽中文字的字體類(lèi)型
bitmap 設(shè)置標(biāo)簽的現(xiàn)實(shí)的位圖
image 設(shè)置標(biāo)簽中顯示的圖片
justify 設(shè)置標(biāo)簽中多行文本的對(duì)齊方式
textvariable 設(shè)置文本對(duì)應(yīng)的變量,可以通過(guò)修改變量改變文字顯示,必須使用tkinter.IntVar() 或者tkinter.StringVar()產(chǎn)生的變量
"""
import tkinter
# 創(chuàng)建一個(gè)主窗口
win = tkinter.Tk()
# 設(shè)置標(biāo)題
win.title("Python-14")
# 設(shè)置窗口大小和位置
# 500x500 表示窗口大小
# +200+50 表示窗口距離電腦屏幕的左邊緣和上邊緣的距離
win.geometry("500x500+200+50")
"""
Label:標(biāo)簽空間,可以顯示文本
win:主窗口
text:顯示文本內(nèi)容
bg:背景顏色
fg:字體顏色
font:設(shè)置字體和字體大小
wraplength:指定text中多寬之后進(jìn)行換行
anchor:文本顯示的位置 n北 e東 s南 w西 center居中 ne se sw nw
justify:設(shè)置換行之后的對(duì)齊方式
"""
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"
)
# 顯示標(biāo)簽
label.pack()
# 啟動(dòng)主窗口
win.mainloop()
組件4 單選框(Radiobutton)與復(fù)選框(Checkbutton)
"""
thinter.Radiobutton(用于存放的父組件,屬性參數(shù)...)
thinter.Checkbutton(用于存放的父組件,屬性參數(shù)...)
"""
具有以下屬性
"""
anchor 設(shè)置組件中文字的對(duì)齊方式
background(bg) 指定組件的背景色。
borderwidth(bd) 指定組件邊框的寬度。
bitmap 指定組件中的位圖。
font 指定組件中文本的字體。
foreground(fg) 指定組件的前
height 指定組件的高度。
image 指定組件中的圖片。
justify 指定組件中多行文本的對(duì)齊方式。
text 指定組件中的文本,可以 使用“\ n” 表示換行。
value 指定組件被選中后狀態(tài)的值(單選框)
onvalue 組件勾選狀態(tài)值(復(fù)選框)
offvalue 組件取消勾選狀態(tài)的值(復(fù)選框)
variable 指定組件所關(guān)聯(lián)的變量。需要使用tkinter. IntVar()或者tkinter. StringVar()創(chuàng)建的值
width 指定組件的寬度。
command 設(shè)置復(fù)選框操作的觸發(fā)命令(復(fù)選框)
"""
# 復(fù)選框
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中所有內(nèi)容
text.delete(0.0,tkinter.END)
# 把message寫(xiě)入text中
text.insert(tkinter.INSERT,message)
# 判斷復(fù)選框是否被選定 返回一個(gè)bool值
res1 = tkinter.BooleanVar()
# 創(chuàng)建一個(gè)復(fù)選框
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()
# 創(chuàng)建一個(gè)文本框
text = tkinter.Text(win,width = 50,height = 20)
text.pack()
# 創(chuàng)建一個(gè)按鈕
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()
# 定義一個(gè)函數(shù) 來(lái)打印單選框的value值
def func():
print(res.get())
# 創(chuàng)建單選框
radio1 = tkinter.Radiobutton(
win,
text = "張三",
value = 1,
variable = res,
command = func
)
radio2 = tkinter.Radiobutton(
win,
text = "李四",
value = 2,
variable = res,
command = func
)
radio3 = tkinter.Radiobutton(
win,text = "王五",
value = 3,
variable = res,
command = func
)
# 顯示單選框
radio1.pack()
radio2.pack()
radio3.pack()
win.mainloop()
組件5 Frame 框架
"""
thinter.Menu(用于存放的父組件,屬性參數(shù)...)
"""
具有以下屬性
"""
background(bg) 正常的背景顏色顯示在標(biāo)簽和指示器后面。
borderwidth(bd) 指標(biāo)周?chē)吔绲拇笮?。默認(rèn)值為2像素。
cursor 如果將此選項(xiàng)設(shè)置為光標(biāo)名稱(chēng)(箭頭,點(diǎn)等),則鼠標(biāo)光標(biāo)將在檢查按鈕上方更改為該模式。
height 新框架的垂直尺寸。
highlightbackground 當(dāng)框架沒(méi)有焦點(diǎn)時(shí),焦點(diǎn)的顏色突出顯示。
highlightcolor 當(dāng)框架具有焦點(diǎn)時(shí),焦點(diǎn)突出顯示的顏色。
highlightthickness 焦點(diǎn)亮點(diǎn)的厚度。
relief 使用默認(rèn)值,relief = FLAT,檢查按鈕不會(huì)從背景中脫穎而出。您可以將此選項(xiàng)設(shè)置為任何其他樣式
width checkbutton的默認(rèn)寬度取決于所顯示的圖像或文字的大小。你可以設(shè)置此選項(xiàng)的字符數(shù)和checkbutton的,總是有許多字符的空間。
"""
#布局
import tkinter
win = tkinter.Tk()
win.title("Pyhton-14")
win.geometry("500x500+200+100")
# 創(chuàng)建一個(gè)框架
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()
#絕對(duì)定位
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()
#相對(duì)定位
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 = "小藍(lán)",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()
事件綁定
之前能夠觸發(fā)操作的只有2個(gè)組件,一個(gè)按鈕一個(gè)菜單的選項(xiàng)卡 command屬性 設(shè)置操作對(duì)應(yīng)的函數(shù)
鼠標(biāo)事件類(lèi)型
"""
<Button-1> 按下了鼠標(biāo)左鍵 <ButtonPress-1>
<Button-2> 按下了鼠標(biāo)中鍵 <ButtonPress-2>
<Button-3> 按下了鼠標(biāo)右鍵 <ButtonPress-3>
<Enter> 鼠標(biāo)進(jìn)入組件區(qū)域
<Leave> 鼠標(biāo)離開(kāi)組件區(qū)域
<ButtonRelease-1> 釋放了鼠標(biāo)左鍵
<ButtonRelease-2> 釋放了鼠標(biāo)中鍵
<ButtonRelease-3> 釋放了鼠標(biāo)右鍵
<B1-Moion> 按住鼠標(biāo)左鍵移動(dòng)
<B2-Moion> 按住鼠標(biāo)中鍵移動(dòng)
<B3-Moion> 按住鼠標(biāo)右鍵移動(dòng)
<Double-Button-1> 雙擊鼠標(biāo)左鍵
<Double-Button-2> 雙擊鼠標(biāo)中鍵
<Double-Button-3> 雙擊鼠標(biāo)右鍵
<MouseWheel> 滾動(dòng)鼠標(biāo)滾輪
"""
鍵盤(pán)事件類(lèi)型
"""
<KeyPress> 表示任何鍵盤(pán)按下
<KeyPress-A> 表示按下鍵盤(pán)A鍵 A可以設(shè)置為其他的按鍵
<Alt-KeyPress-A> 表示同時(shí)按下Alt和A鍵 A可以設(shè)置為其他的按鍵
<Control-KeyPress-A> 表示同時(shí)按下Ctrl和A鍵 A可以設(shè)置為其他的按鍵
<Shift-KeyPress-A> 表示同時(shí)按下Shift和A鍵 A可以設(shè)置為其他的按鍵
<Double-KeyPress-A> 表示雙擊鍵盤(pán)A鍵 A可以設(shè)置為其他的按鍵
<Lock-KeyPress-A> 表示開(kāi)啟大寫(xiě)之后鍵盤(pán)A鍵 A可以設(shè)置為其他的按鍵
<Alt-Control-KeyPress-A> 表示同時(shí)按下alt+Ctrl和A鍵 A可以設(shè)置為其他的按鍵
注意:鍵盤(pán)事件除了entry和text組件其他組件的事件最好綁定在主界面上
"""
事件對(duì)象中包含的信息
"""
x,y 當(dāng)前觸發(fā)事件時(shí)鼠標(biāo)相對(duì)觸發(fā)事件的組件的坐標(biāo)值
x_root,y_root 當(dāng)前觸發(fā)事件時(shí)鼠標(biāo)相對(duì)于屏幕的坐標(biāo)值
char 獲取當(dāng)前鍵盤(pán)事件時(shí)按下的鍵對(duì)應(yīng)的字符
keycode 獲取當(dāng)前鍵盤(pán)事件時(shí)按下的鍵對(duì)應(yīng)的的ascii碼
type 獲取事件的類(lèi)型
num 獲取鼠標(biāo)按鍵類(lèi)型 123 左中右
widget 觸發(fā)事件的組件
width/height 組件改變之后的大小和configure()相關(guān)
"""
窗口和組件相關(guān)事件類(lèi)型
"""
Activate 當(dāng)中組件由不可以用變?yōu)榭捎脮r(shí) 針對(duì)于state的變值
Deactivate 當(dāng)組件由可用變?yōu)椴豢捎脮r(shí)觸發(fā)
Configure 當(dāng)組件大小發(fā)生變化時(shí)觸發(fā)
Destory 當(dāng)組件銷(xiāo)毀時(shí)觸發(fā)
FocusIn 當(dāng)組件獲取焦點(diǎn)時(shí)觸發(fā) 針對(duì)于Entry和Text有效
Map 當(dāng)組件由隱藏變?yōu)轱@示時(shí)觸發(fā)
UnMap 當(dāng)組件由顯示變?yōu)殡[藏時(shí)觸發(fā)
Perproty 當(dāng)窗口屬性發(fā)生變化時(shí)觸發(fā)
"""
事件綁定函數(shù)
組件.bind('事件類(lèi)型',事件函數(shù))
#為一個(gè)組件綁定一個(gè)操作
組件.bind_class('組件類(lèi)型','事件類(lèi)型',事件函數(shù))
#為一類(lèi)組件綁定一個(gè)操作
#組件類(lèi)型就是創(chuàng)建組件的方法名 例如按鈕組件:Button
組件.bind_all('事件類(lèi)型',事件函數(shù))
#為所有組件綁定一個(gè)操作(所有操作都會(huì)當(dāng)作對(duì)主界面的操作)
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()
練習(xí)
文件對(duì)比
import sys
import difflib
# sys.argv : 獲取外部運(yùn)行時(shí)的命令 返回一個(gè)列表
# sys.argv : 獲取外部運(yùn)行時(shí)的命令 返回一個(gè)列表
# print(sys.argv)
#
# file1 = sys.argv[1]
# file2 = sys.argv[2]
# print(file1)
# print(file2)
# difflib
# 創(chuàng)建比對(duì)對(duì)象 HtmlDiff() 生成一個(gè)html文件
# 比對(duì)內(nèi)容 make_file()
import sys
import difflib
# sys.argv : 獲取外部運(yùn)行時(shí)的命令 返回一個(gè)列表
# sys.argv : 獲取外部運(yùn)行時(shí)的命令 返回一個(gè)列表
# print(sys.argv)
# difflib
# 創(chuàng)建比對(duì)對(duì)象 HtmlDiff() 生成一個(gè)html文件
# 比對(duì)內(nèi)容 make_file()
first_path = sys.argv[1] # 獲取第一個(gè)要比對(duì)的文件名稱(chēng)
next_path = sys.argv[2] # 獲取第二個(gè)要比對(duì)的文件名稱(chēng)
# 分別讀取兩個(gè)文件
with open(first_path,"r") as f:
first_list = f.readlines()
with open(next_path,"r") as f:
next_list = f.readlines()
# 生成比對(duì)對(duì)象
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到文件當(dāng)前地址
# python 文件名.py 文件1 文件2
計(jì)算器
from tkinter import *
root = Tk()
root.geometry('250x380')
root.title('計(jì)算器')
frame_show = Frame(width=300,height=150,bg='#dddddd')
#頂部區(qū)域
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()
#是否按下了運(yùn)算符
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
#運(yùn)算
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
#獲取當(dāng)前界面的數(shù)值準(zhǔn)備運(yùn)算
calc.append(v.get())
print(calc)
#組成運(yùn)算字符串
calcstr = ''.join(calc)
#檢測(cè)最后一位是否是運(yùn)算符,是就刪除
if calcstr[-1] in '+-*/':
calcstr = calcstr[0:-1]
#print(calcstr)
#運(yùn)算操作
result = eval(calcstr)
#顯示結(jié)果
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
#正負(fù)操作
def fan():
strnum = v.get()
if strnum[0] == '-':
v.set(strnum[1:])
elif strnum[0] != '-' and strnum != '0' :
v.set('-'+strnum)
#按鍵區(qū)域
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()