主頁 > 後端開發 > 還不會用Python寫界面軟體就out了!哪個在售軟體是沒有UI的?

還不會用Python寫界面軟體就out了!哪個在售軟體是沒有UI的?

2021-09-09 15:18:44 後端開發

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

上一篇:【JS 逆向百例】XHR 斷點除錯,Steam 登錄逆向

下一篇:Python教你從0搭建微信推送斗魚直播提醒(單房間簡化版)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more