Tkinter


 

Tkinter 是使用 python 進行窗口視窗設計的模塊。Tkinter模塊是Python的標准Tk GUI工具包的接口。tkinter是python 自帶的。Python的Tkinter界面庫是非常簡單的。python的GUI庫非常多,選擇Tkinter,一是最為簡單,二是自帶庫,三則是從需求出發,Python作為一種腳本語言,一種膠水語言,一般不會用它來開發復雜的桌面應用,它並不具備這方面的優勢。對於Tkinter編程,可以用兩個比喻來理解:

  • 第一個,作畫。我們都見過美術生寫生的情景,先支一個畫架,放上畫板,蒙上畫布,構思內容,用鉛筆畫草圖,組織結構和比例,調色板調色,最后畫筆勾勒。相應的,對應到tkinter編程,那么我們的顯示屏就是支起來的畫架,根窗體就是畫板,在tkinter中則是Toplevel,畫布就是tkinter中的容器(Frame),畫板上可以放很多張畫布(Convas),tkinter中的容器中也可以放很多個容器,繪畫中的構圖布局則是tkinter中的布局管理器(幾何管理器),繪畫的內容就是tkinter中的一個個小組件,一幅畫由許多元素構成,而我們的GUI界面,就是有一個個組件拼裝起來的,它們就是widget。
  • 第二個,我們小時候都玩過積木,只要發揮創意,相同的積木可以堆出各種造型。tkinter的組件也可以看做一個個積木,形狀或許不同,其本質都是一樣的,就是一個積木,不管它長什么樣子,它始終就是積木!所以這些小組件都有許多共性,另外,個人認為,學習界面編程,最重要的不是一開始學習每個積木的樣子,不是學習每個組件怎么用,而是這些組件該怎么放。初始學習中,怎么放遠遠比怎么用重要的多。網上有大量的文章資料,基本全是介紹組件怎么用的,對於怎么放,也就是tkinter中的布局管理器,都是一筆帶過,這對初學者有點本末倒置,或許絕大部分是轉載的原因吧,極少是自己真正寫的。組件怎么用不是最迫切的,用到的時候再去了解也不遲,邊用邊學反而更好。因此我將專門寫一章,詳細介紹布局管理器的使用。

一、Tkinter 控件詳細介紹

 

注:紅色的為Tkinter支持16個核心的窗口部件。在Tkinter中窗口部件類沒有分級;所有的窗口部件類在樹中都是兄弟關系。

 

二、動手實踐學習

1. 創建主窗口及Label部件(標簽)創建使用

  我們要學習使用上面提到的這些控件首先要創建一個主窗口,就像作畫一樣,先要架好架子和畫板,然后才能在上面放畫紙和各種繪畫元素,創建好主窗口才能在上面放置各種控件元素。而創建過程是很簡單的,如下:

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,在圖形界面上設定標簽
=  tk.Label(window, text = '你好!this is Tkinter' , bg = 'green' , font = ( 'Arial' 12 ), width = 30 , height = 2 )
# 說明: bg為背景,font為字體,width為長,height為高,這里的長和高是字符的長和高,比如height=2,就是標簽有2個字符這么高
 
# 第5步,放置標簽
l.pack()     # Label內容content區域放置位置,自動調節尺寸
# 放置lable的方法有:1)l.pack(); 2)l.place();
 
# 第6步,主窗口循環顯示
window.mainloop()
# 注意,loop因為是循環的意思,window.mainloop就會讓window不斷的刷新,如果沒有mainloop,就是一個靜態的window,傳入進去的值就不會有循環,mainloop就相當於一個很大的while循環,有個while,每點擊一次就會更新一次,所以我們必須要有循環
# 所有的窗口文件都必須有類似的mainloop函數,mainloop是窗口文件的關鍵的關鍵。

  測試效果:

2. Button窗口部件

  簡單說明:

  Button(按鈕)部件是一個標准的Tkinter窗口部件,用來實現各種按鈕。按鈕能夠包含文本或圖象,並且你能夠將按鈕與一個Python函數或方法相關聯。當這個按鈕被按下時,Tkinter自動調用相關聯的函數或方法。

按鈕僅能顯示一種字體,但是這個文本可以跨行。另外,這個文本中的一個字母可以有下划線,例如標明一個快捷鍵。默認情況,Tab鍵用於將焦點移動到一個按鈕部件。

  什么時候用按鈕部件

  簡言之,按鈕部件用來讓用戶說“馬上給我執行這個任務”,通常我們用顯示在按鈕上的文本或圖象來提示。按鈕通常用在工具條中或應用程序窗口中,並且用來接收或忽略輸入在對話框中的數據。關於按鈕和輸入的數據的配合,可以參看Checkbutton和Radiobutton部件。

  如何創建:

普通的按鈕很容易被創建,僅僅指定按鈕的內容(文本、位圖、圖象)和一個當按鈕被按下時的回調函數即可:

b = tk.Button(window, text="hit me", command=hit_me)

沒有回調函數的按鈕是沒有用的,當你按下這個按鈕時它什么也不做。你可能在開發一個應用程序的時候想實現這種按鈕,比如為了不干擾你的beta版的測試者:

b = tk.Button(window, text="Help", command=DISABLED)

   示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,在圖形界面上設定標簽
var  =  tk.StringVar()     # 將label標簽的內容設置為字符類型,用var來接收hit_me函數的傳出內容用以顯示在標簽上
=  tk.Label(window, textvariable = var, bg = 'green' , fg = 'white' , font = ( 'Arial' 12 ), width = 30 , height = 2 )
# 說明: bg為背景,fg為字體顏色,font為字體,width為長,height為高,這里的長和高是字符的長和高,比如height=2,就是標簽有2個字符這么高
l.pack()
 
# 定義一個函數功能(內容自己自由編寫),供點擊Button按鍵時調用,調用命令參數command=函數名
on_hit  =  False
def  hit_me():
     global  on_hit
     if  on_hit  = =  False :
         on_hit  =  True
         var. set ( 'you hit me' )
     else :
         on_hit  =  False
         var. set ('')
 
# 第5步,在窗口界面設置放置Button按鍵
=  tk.Button(window, text = 'hit me' , font = ( 'Arial' 12 ), width = 10 , height = 1 , command = hit_me)
b.pack()
 
# 第6步,主窗口循環顯示
window.mainloop()

  測試效果:

 

3. Entry窗口部件

  簡單說明:  

  Entry是tkinter類中提供的的一個單行文本輸入域,用來輸入顯示一行文本,收集鍵盤輸入(類似 HTML 中的 text)。

  什么時候用:

  需要用戶輸入用戶信息時,比如我們平時使用軟件、登錄網頁時,用戶交互界面讓我們登錄賬戶信息等時候可以用到。

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,在圖形界面上設定輸入框控件entry並放置控件
e1  =  tk.Entry(window, show = '*' , font = ( 'Arial' 14 ))    # 顯示成密文形式
e2  =  tk.Entry(window, show = None , font = ( 'Arial' 14 ))   # 顯示成明文形式
e1.pack()
e2.pack()
 
# 第5步,主窗口循環顯示
window.mainloop()

  測試效果:

4. Text窗口部件

  簡單說明:  

  Text是tkinter類中提供的的一個多行文本區域,顯示多行文本,可用來收集(或顯示)用戶輸入的文字(類似 HTML 中的 textarea),格式化文本顯示,允許你用不同的樣式和屬性來顯示和編輯文本,同時支持內嵌圖象和窗口。

  什么時候用:

  在需要顯示編輯用戶、產品多行信息時,比如顯示用戶詳細描述文字,產品簡介等等,支持隨時編輯。

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,在圖形界面上設定輸入框控件entry框並放置
=  tk.Entry(window, show  =  None ) #顯示成明文形式
e.pack()
 
# 第5步,定義兩個觸發事件時的函數insert_point和insert_end(注意:因為Python的執行順序是從上往下,所以函數一定要放在按鈕的上面)
def  insert_point():  # 在鼠標焦點處插入輸入內容
     var  =  e.get()
     t.insert( 'insert' , var)
def  insert_end():    # 在文本框內容最后接着插入輸入內容
     var  =  e.get()
     t.insert( 'end' , var)
 
# 第6步,創建並放置兩個按鈕分別觸發兩種情況
b1  =  tk.Button(window, text = 'insert point' , width = 10 ,
                height = 2 , command = insert_point)
b1.pack()
b2  =  tk.Button(window, text = 'insert end' , width = 10 ,
                height = 2 , command = insert_end)
b2.pack()
 
# 第7步,創建並放置一個多行文本框text用以顯示,指定height=3為文本框是三個字符高度
=  tk.Text(window, height = 3 )
t.pack()
 
# 第8步,主窗口循環顯示
window.mainloop()

  測試效果:

5. Listbox窗口部件

  簡單說明:  

  Text是tkinter類中提供的的列表框部件,顯示供選方案的一個列表。listbox能夠被配置來得到radiobutton或checklist的行為。

  什么時候用:

  在有一個很多內容選項組成的列表提供用戶選擇時會用到。

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,在圖形界面上創建一個標簽label用以顯示並放置
var1  =  tk.StringVar()   # 創建變量,用var1用來接收鼠標點擊具體選項的內容
=  tk.Label(window, bg = 'green' , fg = 'yellow' ,font = ( 'Arial' 12 ), width = 10 , textvariable = var1)
l.pack()
 
# 第6步,創建一個方法用於按鈕的點擊事件
def  print_selection():
     value  =  lb.get(lb.curselection())    # 獲取當前選中的文本
     var1. set (value)   # 為label設置值
 
# 第5步,創建一個按鈕並放置,點擊按鈕調用print_selection函數
b1  =  tk.Button(window, text = 'print selection' , width = 15 , height = 2 , command = print_selection)
b1.pack()
 
# 第7步,創建Listbox並為其添加內容
var2  =  tk.StringVar()
var2. set (( 1 , 2 , 3 , 4 ))  # 為變量var2設置值
# 創建Listbox
lb  =  tk.Listbox(window, listvariable = var2)   #將var2的值賦給Listbox
# 創建一個list並將值循環添加到Listbox控件中
list_items  =  [ 11 , 22 , 33 , 44 ]
for  item  in  list_items:
     lb.insert( 'end' , item)   # 從最后一個位置開始加入值
lb.insert( 1 'first' )        # 在第一個位置加入'first'字符
lb.insert( 2 'second' )       # 在第二個位置加入'second'字符
lb.delete( 2 )                 # 刪除第二個位置的字符
lb.pack()
 
# 第8步,主窗口循環顯示
window.mainloop()

  測試效果:

6. Radiobutton窗口部件

  簡單說明:  

  Radiobutton:代表一個變量,它可以有多個值中的一個。點擊它將為這個變量設置值,並且清除與這同一變量相關的其它radiobutton。

  什么時候用:

  在有一個很多內容選項組成的選項列表提供用戶選擇時會用到,用戶一次只能選擇其中一個,不能多選。

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,在圖形界面上創建一個標簽label用以顯示並放置
var  =  tk.StringVar()     # 定義一個var用來將radiobutton的值和Label的值聯系在一起.
=  tk.Label(window, bg = 'yellow' , width = 20 , text = 'empty' )
l.pack()
 
# 第6步,定義選項觸發函數功能
def  print_selection():
     l.config(text = 'you have selected '  +  var.get())
 
# 第5步,創建三個radiobutton選項,其中variable=var, value='A'的意思就是,當我們鼠標選中了其中一個選項,把value的值A放到變量var中,然后賦值給variable
r1  =  tk.Radiobutton(window, text = 'Option A' , variable = var, value = 'A' , command = print_selection)
r1.pack()
r2  =  tk.Radiobutton(window, text = 'Option B' , variable = var, value = 'B' , command = print_selection)
r2.pack()
r3  =  tk.Radiobutton(window, text = 'Option C' , variable = var, value = 'C' , command = print_selection)
r3.pack()
 
# 第7步,主窗口循環顯示
window.mainloop()

  測試效果:

7. Checkbutton窗口部件

  簡單說明:  

  Checkbutton:代表一個變量,它有兩個不同的值。點擊這個按鈕將會在這兩個值間切換,選擇和取消選擇。

  什么時候用:

  在有一個很多內容選項組成的選項列表提供用戶選擇時會用到,用戶一次可以選擇多個。

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,在圖形界面上創建一個標簽label用以顯示並放置
=  tk.Label(window, bg = 'yellow' , width = 20 , text = 'empty' )
l.pack()
 
# 第6步,定義觸發函數功能
def  print_selection():
     if  (var1.get()  = =  1 ) & (var2.get()  = =  0 ):      # 如果選中第一個選項,未選中第二個選項
         l.config(text = 'I love only Python ' )
     elif  (var1.get()  = =  0 ) & (var2.get()  = =  1 ):    # 如果選中第二個選項,未選中第一個選項
         l.config(text = 'I love only C++' )
     elif  (var1.get()  = =  0 ) & (var2.get()  = =  0 ):    # 如果兩個選項都未選中
         l.config(text = 'I do not love either' )
     else :
         l.config(text = 'I love both' )              # 如果兩個選項都選中
 
# 第5步,定義兩個Checkbutton選項並放置
var1  =  tk.IntVar()   # 定義var1和var2整型變量用來存放選擇行為返回值
var2  =  tk.IntVar()
c1  =  tk.Checkbutton(window, text = 'Python' ,variable = var1, onvalue = 1 , offvalue = 0 , command = print_selection)     # 傳值原理類似於radiobutton部件
c1.pack()
c2  =  tk.Checkbutton(window, text = 'C++' ,variable = var2, onvalue = 1 , offvalue = 0 , command = print_selection)
c2.pack()
 
# 第7步,主窗口循環顯示
window.mainloop()

  測試效果:

  

8. Scale窗口部件

  簡單說明:  

  Scale: 尺度(拉動條),允許你通過滑塊來設置一數字值。

  什么時候用:

  在需要用戶給出評價等級,或者給出一個評價分數,或者拉動滑動條提供一個具體的數值等等。

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,在圖形界面上創建一個標簽label用以顯示並放置
=  tk.Label(window, bg = 'green' , fg = 'white' , width = 20 , text = 'empty' )
l.pack()
 
# 第6步,定義一個觸發函數功能
def  print_selection(v):
     l.config(text = 'you have selected '  +  v)<br>
# 第5步,創建一個尺度滑條,長度200字符,從0開始10結束,以2為刻度,精度為0.01,觸發調用print_selection函數
=  tk.Scale(window, label = 'try me' , from_ = 0 , to = 10 , orient = tk.HORIZONTAL, length = 200 , showvalue = 0 ,tickinterval = 2 , resolution = 0.01 , command = print_selection)
s.pack()
 
# 第7步,主窗口循環顯示
window.mainloop()

  測試效果:

9. Canvas窗口部件

  簡單說明:  

  Canvas:畫布,提供繪圖功能(直線、橢圓、多邊形、矩形) 可以包含圖形或位圖,用來繪制圖表和圖,創建圖形編輯器,實現定制窗口部件。

  什么時候用:

  在比如像用戶交互界面等,需要提供設計的圖標、圖形、logo等信息是可以用到畫布。

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,在圖形界面上創建 500 * 200 大小的畫布並放置各種元素
canvas  =  tk.Canvas(window, bg = 'green' , height = 200 , width = 500 )
# 說明圖片位置,並導入圖片到畫布上
image_file  =  tk.PhotoImage( file = 'pic.gif' )   # 圖片位置(相對路徑,與.py文件同一文件夾下,也可以用絕對路徑,需要給定圖片具體絕對路徑)
image  =  canvas.create_image( 250 0 , anchor = 'n' ,image = image_file)         # 圖片錨定點(n圖片頂端的中間點位置)放在畫布(250,0)坐標處
# 定義多邊形參數,然后在畫布上畫出指定圖形
x0, y0, x1, y1  =  100 100 150 150
line  =  canvas.create_line(x0 - 50 , y0 - 50 , x1 - 50 , y1 - 50 )                    # 畫直線
oval  =  canvas.create_oval(x0 + 120 , y0 + 50 , x1 + 120 , y1 + 50 , fill = 'yellow' )   # 畫圓 用黃色填充
arc  =  canvas.create_arc(x0, y0 + 50 , x1, y1 + 50 , start = 0 , extent = 180 )       # 畫扇形 從0度打開收到180度結束
rect  =  canvas.create_rectangle( 330 30 330 + 20 30 + 20 )                   # 畫矩形正方形
canvas.pack()
 
# 第6步,觸發函數,用來一定指定圖形
def  moveit():
     canvas.move(rect,  2 2 # 移動正方形rect(也可以改成其他圖形名字用以移動一起圖形、元素),按每次(x=2, y=2)步長進行移動
 
# 第5步,定義一個按鈕用來移動指定圖形的在畫布上的位置
=  tk.Button(window, text = 'move item' ,command = moveit).pack()
 
# 第7步,主窗口循環顯示
window.mainloop()

  所用圖片:

  當然你可以隨意用你的一張圖片導入畫布試一試效果,圖片可以用畫圖工具改一下像素大小,以免圖片太大,導入畫布顯示不全,當然你也可以用我提供的素材,下面是鏈接:https://files.cnblogs.com/files/shwee/pic.gif

 

  圖片錨定點位置參數圖:

  測試效果:

10. Menu窗口部件

  簡單說明:  

  Menu:菜單條,用來實現下拉和彈出式菜單,點下菜單后彈出的一個選項列表,用戶可以從中選擇

  什么時候用:

  在比如像軟件或網頁交互界面等,需要提供菜單選項功能提供用戶選擇菜單選項功能時用到。

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,在圖形界面上創建一個標簽用以顯示內容並放置
=  tk.Label(window, text = '      ' , bg = 'green' )
l.pack()
 
# 第10步,定義一個函數功能,用來代表菜單選項的功能,這里為了操作簡單,定義的功能比較簡單
counter  =  0
def  do_job():
     global  counter
     l.config(text = 'do ' +  str (counter))
     counter  + =  1
 
# 第5步,創建一個菜單欄,這里我們可以把他理解成一個容器,在窗口的上方
menubar  =  tk.Menu(window)
 
# 第6步,創建一個File菜單項(默認不下拉,下拉內容包括New,Open,Save,Exit功能項)
filemenu  =  tk.Menu(menubar, tearoff = 0 )
# 將上面定義的空菜單命名為File,放在菜單欄中,就是裝入那個容器中
menubar.add_cascade(label = 'File' , menu = filemenu)
 
# 在File中加入New、Open、Save等小菜單,即我們平時看到的下拉菜單,每一個小菜單對應命令操作。
filemenu.add_command(label = 'New' , command = do_job)
filemenu.add_command(label = 'Open' , command = do_job)
filemenu.add_command(label = 'Save' , command = do_job)
filemenu.add_separator()     # 添加一條分隔線
filemenu.add_command(label = 'Exit' , command = window.quit)  # 用tkinter里面自帶的quit()函數
 
# 第7步,創建一個Edit菜單項(默認不下拉,下拉內容包括Cut,Copy,Paste功能項)
editmenu  =  tk.Menu(menubar, tearoff = 0 )
# 將上面定義的空菜單命名為 Edit,放在菜單欄中,就是裝入那個容器中
menubar.add_cascade(label = 'Edit' , menu = editmenu)
 
# 同樣的在 Edit 中加入Cut、Copy、Paste等小命令功能單元,如果點擊這些單元, 就會觸發do_job的功能
editmenu.add_command(label = 'Cut' , command = do_job)
editmenu.add_command(label = 'Copy' , command = do_job)
editmenu.add_command(label = 'Paste' , command = do_job)
 
# 第8步,創建第二級菜單,即菜單項里面的菜單
submenu  =  tk.Menu(filemenu)  # 和上面定義菜單一樣,不過此處實在File上創建一個空的菜單
filemenu.add_cascade(label = 'Import' , menu = submenu, underline = 0 # 給放入的菜單submenu命名為Import
 
# 第9步,創建第三級菜單命令,即菜單項里面的菜單項里面的菜單命令(有點拗口,笑~~~)
submenu.add_command(label = 'Submenu_1' , command = do_job)    # 這里和上面創建原理也一樣,在Import菜單項中加入一個小菜單命令Submenu_1
 
# 第11步,創建菜單欄完成后,配置讓菜單欄menubar顯示出來
window.config(menu = menubar)
 
# 第12步,主窗口循環顯示
window.mainloop()

  測試效果:

11. Frame 窗口部件

  簡單說明:  

  Frame:框架,用來承載放置其他GUI元素,就是一個容器,是一個在 Windows 上分離小區域的部件, 它能將 Windows 分成不同的區,然后存放不同的其他部件. 同時一個 Frame 上也能再分成兩個 Frame, Frame 可以認為是一種容器.

  什么時候用:

  在比如像軟件或網頁交互界面等,有不同的界面邏輯層級和功能區域划分時可以用到,讓交互界面邏輯更加清晰。

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,在圖形界面上創建一個標簽用以顯示內容並放置
tk.Label(window, text = 'on the window' , bg = 'red' , font = ( 'Arial' 16 )).pack()    # 和前面部件分開創建和放置不同,其實可以創建和放置一步完成
 
# 第5步,創建一個主frame,長在主window窗口上
frame  =  tk.Frame(window)
frame.pack()
 
# 第6步,創建第二層框架frame,長在主框架frame上面
frame_l  =  tk.Frame(frame) # 第二層frame,左frame,長在主frame上
frame_r  =  tk.Frame(frame) # 第二層frame,右frame,長在主frame上
frame_l.pack(side = 'left' )
frame_r.pack(side = 'right' )
 
# 第7步,創建三組標簽,為第二層frame上面的內容,分為左區域和右區域,用不同顏色標識
tk.Label(frame_l, text = 'on the frame_l1' , bg = 'green' ).pack()
tk.Label(frame_l, text = 'on the frame_l2' , bg = 'green' ).pack()
tk.Label(frame_l, text = 'on the frame_l3' , bg = 'green' ).pack()
tk.Label(frame_r, text = 'on the frame_r1' , bg = 'yellow' ).pack()
tk.Label(frame_r, text = 'on the frame_r2' , bg = 'yellow' ).pack()
tk.Label(frame_r, text = 'on the frame_r3' , bg = 'yellow' ).pack()
 
# 第8步,主窗口循環顯示
window.mainloop()

  測試效果:

 

12. messageBox窗口部件

  簡單說明:  

  messageBox:消息框,用於顯示你應用程序的消息框。(Python2中為tkMessagebox),其實這里的messageBox就是我們平時看到的彈窗。 我們首先需要定義一個觸發功能,來觸發這個彈窗,這里我們就放上以前學過的button按鈕,通過觸發功能,調用messagebox吧,點擊button按鈕就會彈出提示對話框。下面給出messagebox提示信息的幾種形式:

1
2
3
4
5
6
tkinter.messagebox.showinfo(title = 'Hi' , message = '你好!' )             # 提示信息對話窗
tkinter.messagebox.showwarning(title = 'Hi' , message = '有警告!' )        # 提出警告對話窗
tkinter.messagebox.showerror(title = 'Hi' , message = '出錯了!' )          # 提出錯誤對話窗
print (tkinter.messagebox.askquestion(title = 'Hi' , message = '你好!' ))   # 詢問選擇對話窗return 'yes', 'no'
print (tkinter.messagebox.askyesno(title = 'Hi' , message = '你好!' ))      # return 'True', 'False'
print (tkinter.messagebox.askokcancel(title = 'Hi' , message = '你好!' ))   # return 'True', 'False'

  什么時候用:

  在比如像軟件或網頁交互界面等,有不同的界面邏輯層級和功能區域划分時可以用到,讓交互界面邏輯更加清晰。

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
import  tkinter.messagebox   # 要使用messagebox先要導入模塊
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第5步,定義觸發函數功能
def  hit_me():
     tkinter.messagebox.showinfo(title = 'Hi' , message = '你好!' )               # 提示信息對話窗
     # tkinter.messagebox.showwarning(title='Hi', message='有警告!')       # 提出警告對話窗
     # tkinter.messagebox.showerror(title='Hi', message='出錯了!')         # 提出錯誤對話窗
     # print(tkinter.messagebox.askquestion(title='Hi', message='你好!'))  # 詢問選擇對話窗return 'yes', 'no'
     # print(tkinter.messagebox.askyesno(title='Hi', message='你好!'))     # return 'True', 'False'
     # print(tkinter.messagebox.askokcancel(title='Hi', message='你好!'))  # return 'True', 'False'
 
# 第4步,在圖形界面上創建一個標簽用以顯示內容並放置
tk.Button(window, text = 'hit me' , bg = 'green' , font = ( 'Arial' 14 ), command = hit_me).pack()
 
# 第6步,主窗口循環顯示
window.mainloop()

  測試效果:

 

13. 窗口部件三種放置方式pack/grid/place

  1. Grid:The Grid Geometry Manager  

  grid 是方格, 所以所有的內容會被放在這些規律的方格中。例如:

1
2
3
for  in  range ( 3 ):
     for  in  range ( 3 ):
         tk.Label(window, text = 1 ).grid(row = i, column = j, padx = 10 , pady = 10 , ipadx = 10 , ipady = 10 )

  以上的代碼就是創建一個三行三列的表格,其實 grid 就是用表格的形式定位的。這里的參數 row 為行,colum 為列,padx 就是單元格左右間距,pady 就是單元格上下間距,ipadx是單元格內部元素與單元格的左右間距,ipady是單元格內部元素與單元格的上下間距。

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,grid 放置方法
for  in  range ( 3 ):
     for  in  range ( 3 ):
         tk.Label(window, text = 1 ).grid(row = i, column = j, padx = 10 , pady = 10 , ipadx = 10 , ipady = 10 )
 
# 第5步,主窗口循環顯示
window.mainloop()

  測試效果:

 

  2. Pack:The Pack Geometry Manager

   我們常用的pack(), 他會按照上下左右的方式排列.例如:

1
2
3
4
tk.Label(window, text = 'P' , fg = 'red' ).pack(side = 'top' )     # 上
tk.Label(window, text = 'P' , fg = 'red' ).pack(side = 'bottom' # 下
tk.Label(window, text = 'P' , fg = 'red' ).pack(side = 'left' )    # 左
tk.Label(window, text = 'P' , fg = 'red' ).pack(side = 'right' )   # 右

   示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,pack 放置方法
tk.Label(window, text = 'P' , fg = 'red' ).pack(side = 'top' )     # 上
tk.Label(window, text = 'P' , fg = 'red' ).pack(side = 'bottom' # 下
tk.Label(window, text = 'P' , fg = 'red' ).pack(side = 'left' )    # 左
tk.Label(window, text = 'P' , fg = 'red' ).pack(side = 'right' )   # 右
 
# 第5步,主窗口循環顯示
window.mainloop()

  測試效果:

  3. Place:The Place Geometry Manager

   再接下來我們來看place(), 這個比較容易理解,就是給精確的坐標來定位,如此處給的(50, 100),就是將這個部件放在坐標為(x=50, y=100)的這個位置, 后面的參數 anchor='nw',就是前面所講的錨定點是西北角。例如:

1
tk.Label(window, text = 'Pl' , font = ( 'Arial' 20 ), ).place(x = 50 , y = 100 , anchor = 'nw' )

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'My Window' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '500x300' )   # 這里的乘是小x
 
# 第4步,place 放置方法(精准的放置到指定坐標點的位置上)
tk.Label(window, text = 'Pl' , font = ( 'Arial' 20 ), ).place(x = 50 , y = 100 , anchor = 'nw' )
 
# 第5步,主窗口循環顯示
window.mainloop()

  測試效果:

 

三、補充介紹

1、簡單實例

  下面的代碼是創建出一個窗口,其他的操作就在這個平台上進行。執行之后會在桌面彈出一個窗口,窗口的標題就是代碼中設置的win.title。

復制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import tkinter
 5 
 6 
 7 # 創建主窗口
 8 win = tkinter.Tk()
 9 # 設置標題
10 win.title("yudanqu")
11 # 設置大小和位置
12 win.geometry("400x400+200+50")
13 
14 # 進入消息循環,可以寫控件
15 
16 win.mainloop()
復制代碼

2、Label控件

復制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import tkinter
 5 
 6 win = tkinter.Tk()
 7 win.title("yudanqu")
 8 win.geometry("400x400+200+50")
 9 
10 '''
11 Label:標簽控件,可以顯示文本
12 '''
13 # win:父窗體
14 # text:顯示的文本內容
15 # bg:背景色
16 # fg:字體顏色
17 # font:字體
18 # wraplength:指定text文本中多寬之后換行
19 # justify:設置換行后的對齊方式
20 # anchor:位置 n北,e東,w西,s南,center居中;還可以寫在一起:ne東北方向
21 label = tkinter.Label(win,
22                       text="this is a word",
23                       bg="pink", fg="red",
24                       font=("黑體", 20),
25                       width=20,
26                       height=10,
27                       wraplength=100,
28                       justify="left",
29                       anchor="ne")
30 
31 # 顯示出來
32 label.pack()
33 
34 
35 win.mainloop()
復制代碼

3、Button控件

復制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import tkinter
 5 
 6 
 7 def func():
 8     print("aaaaaaaaaaaaaaaaaaaaaaa")
 9 
10 
11 win = tkinter.Tk()
12 win.title("yudanqu")
13 win.geometry("400x400+200+50")
14 
15 
16 # 創建按鈕
17 button1 = tkinter.Button(win, text="按鈕", command=func, width=10, height=10)
18 button1.pack()
19 
20 button2 = tkinter.Button(win, text="按鈕", command=lambda: print("bbbbbbbbbbbb"))
21 button2.pack()
22 
23 button3 = tkinter.Button(win, text="退出", command=win.quit)
24 button3.pack()
25 
26 win.mainloop()
復制代碼

4、Entry控件

復制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import tkinter
 5 
 6 win = tkinter.Tk()
 7 win.title("yudanqu")
 8 win.geometry("400x400+200+50")
 9 
10 '''
11 Entry:輸入控件,用於顯示簡單的文本內容
12 '''
13 
14 # 密文顯示
15 entry1 = tkinter.Entry(win, show="*") # show="*" 可以表示輸入密碼
16 entry1.pack()
17 
18 # 綁定變量
19 e = tkinter.Variable()
20 
21 entry2 = tkinter.Entry(win, textvariable=e)
22 entry2.pack()
23 
24 # e就代表輸入框這個對象
25 # 設置值
26 e.set("wewewewewewe")
27 # 取值
28 print(e.get())
29 print(entry2.get())
30 
31 win.mainloop()
復制代碼

5、點擊按鈕輸出輸入框中的內容

復制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import tkinter
 4 
 5 win = tkinter.Tk()
 6 win.title("yudanqu")
 7 win.geometry("400x400+200+50")
 8 
 9 def showinfo():
10     # 獲取輸入的內容
11     print(entry.get())
12 
13 entry = tkinter.Entry(win)
14 entry.pack()
15 
16 button = tkinter.Button(win, text="按鈕", command=showinfo)
17 button.pack()
18 
19 win.mainloop()
復制代碼

6、Text控件

復制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import tkinter
 4 
 5 win = tkinter.Tk()
 6 win.title("yudanqu")
 7 win.geometry("400x400+200+50")
 8 
 9 '''
10 文本控件:用於顯示多行文本
11 '''
12 
13 # height表示的是顯示的行數
14 text = tkinter.Text(win, width=30, height=10)
15 text.pack()
16 
17 str = '''蓋聞天地之數,有十二萬九千六百歲為一元。將一元分為十二會,乃子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥之十二支也。每會該一萬八百歲。且就一日而論:子時得陽氣,而丑則雞鳴;寅不通光,而卯則日出;辰時食后,而巳則挨排;日午天中,而未則西蹉;申時晡而日落酉;戌黃昏而人定亥。譬於大數,若到戌會之終,則天地昏蒙而萬物否矣。再去五千四百歲,交亥會之初,則當黑暗,而兩間人物俱無矣,故曰混沌。又五千四百歲,亥會將終,貞下起元,近子之會,而復逐漸開明。邵康節曰:“冬至子之半,天心無改移。一陽初動處,萬物未生時。”到此,天始有根。再五千四百歲,正當子會,輕清上騰,有日,有月,有星,有辰。日、月、星、辰,謂之四象。故曰,天開於子。又經五千四百歲,子會將終,近丑之會,而逐漸堅實。易曰:“大哉乾元!至哉坤元!萬物資生,乃順承天。”至此,地始凝結。再五千四百歲,正當丑會,重濁下凝,有水,有火,有山,有石,有土。水、火、山、石、土謂之五形。故曰,地辟於丑。又經五千四百歲,丑會終而寅會之初,發生萬物。'''
18 
19 text.insert(tkinter.INSERT, str)
20 
21 win.mainloop()
復制代碼

7、帶滾動條的Text

復制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 
 5 import tkinter
 6 
 7 win = tkinter.Tk()
 8 win.title("yudanqu")
 9 # win.geometry("400x400+200+50")
10 
11 '''
12 文本控件:用於顯示多行文本
13 '''
14 
15 # 創建滾動條
16 scroll = tkinter.Scrollbar()
17 
18 text = tkinter.Text(win, width=30, height=10)
19 # side放到窗體的哪一側,  fill填充
20 scroll.pack(side=tkinter.RIGHT, fill=tkinter.Y)
21 text.pack(side=tkinter.LEFT, fill=tkinter.Y)
22 # 關聯
23 scroll.config(command=text.yview)
24 text.config(yscrollcommand=scroll.set)
25 
26 text.pack()
27 
28 str = '''蓋聞天地之數,有十二萬九千六百歲為一元。將一元分為十二會,乃子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥之十二支也。每會該一萬八百歲。且就一日而論:子時得陽氣,而丑則雞鳴;寅不通光,而卯則日出;辰時食后,而巳則挨排;日午天中,而未則西蹉;申時晡而日落酉;戌黃昏而人定亥。譬於大數,若到戌會之終,則天地昏蒙而萬物否矣。再去五千四百歲,交亥會之初,則當黑暗,而兩間人物俱無矣,故曰混沌。又五千四百歲,亥會將終,貞下起元,近子之會,而復逐漸開明。邵康節曰:“冬至子之半,天心無改移。一陽初動處,萬物未生時。”到此,天始有根。再五千四百歲,正當子會,輕清上騰,有日,有月,有星,有辰。日、月、星、辰,謂之四象。故曰,天開於子。又經五千四百歲,子會將終,近丑之會,而逐漸堅實。易曰:“大哉乾元!至哉坤元!萬物資生,乃順承天。”至此,地始凝結。再五千四百歲,正當丑會,重濁下凝,有水,有火,有山,有石,有土。水、火、山、石、土謂之五形。故曰,地辟於丑。又經五千四百歲,丑會終而寅會之初,發生萬物。'''
29 
30 text.insert(tkinter.INSERT, str)
31 
32 win.mainloop()
復制代碼

8、Checkbutton多選框控件

復制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import tkinter
 4 
 5 win = tkinter.Tk()
 6 win.title("yudanqu")
 7 win.geometry("400x400+200+50")
 8 
 9 def updata():
10     message = ""
11     if hobby1.get() ==True:
12         message += "money\n"
13     if hobby2.get() == True:
14         message += "power\n"
15     if hobby3.get() == True:
16         message += "people\n"
17 
18     # 清空text中所有內容
19     text.delete(0.0, tkinter.END)
20     text.insert(tkinter.INSERT, message)
21 
22 # 要綁定的變量
23 hobby1 = tkinter.BooleanVar()
24 # 多選框
25 check1 = tkinter.Checkbutton(win, text="money", variable=hobby1, command=updata)
26 check1.pack()
27 hobby2 = tkinter.BooleanVar()
28 check2 = tkinter.Checkbutton(win, text="power", variable=hobby2, command=updata)
29 check2.pack()
30 hobby3 = tkinter.BooleanVar()
31 check3 = tkinter.Checkbutton(win, text="people", variable=hobby3, command=updata)
32 check3.pack()
33 
34 text = tkinter.Text(win, width=50, height=5)
35 text.pack()
36 
37 win.mainloop()
復制代碼

9、Radiobutton單選框

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 def updata():
 8     print(r.get())
 9 
10 # 綁定變量,一組單選框要綁定同一個變量,就能區分出單選框了
11 r = tkinter.IntVar()
12 
13 radio1 = tkinter.Radiobutton(win, text="one", value=1, variable=r, command=updata)
14 radio1.pack()
15 radio2 = tkinter.Radiobutton(win, text="two", value=2, variable=r, command=updata)
16 radio2.pack()
17 
18 win.mainloop()
復制代碼

10、Listbox控件一

復制代碼
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import tkinter
 4 
 5 win = tkinter.Tk()
 6 win.title("yudanqu")
 7 win.geometry("400x400+200+50")
 8 
 9 '''
10 列表框控件:可以包含一個或多個文本框
11 作用:在listbox控件的小窗口顯示一個字符串
12 '''
13 
14 # 創建一個listbox,添加幾個元素
15 lb = tkinter.Listbox(win, selectmode=tkinter.BROWSE)
16 lb.pack()
17 
18 for item in ["good", "nice", "handsome", "aaa", "bbb", "ccc", "ddd"]:
19     # 按順序添加
20     lb.insert(tkinter.END, item)
21 
22 # 在開始添加
23 lb.insert(tkinter.ACTIVE, "cool")
24 
25 # 將列表當做一個元素添加
26 # lb.insert(tkinter.END, ["very good", "very nice"])
27 
28 # 刪除:參數1為開始的索引,參數2為結束的索引,如果不指定參數2,只刪除第一個索引處的內容
29 lb.delete(1,3)
30 
31 # 選中:參數1為開始的索引,參數2為結束的索引,如果不指定參數2,只選中第一個索引處的內容
32 lb.select_set(2,3)
33 
34 # 取消選中:參數1為開始的索引,參數2為結束的索引,如果不指定參數2,只取消第一個索引處的內容
35 lb.select_clear(2)
36 
37 # 獲取到列表中的元素個數
38 print(lb.size())
39 # 獲取值
40 print(lb.get(2,3))
41 
42 # 返回當前的索引項,不是item元素
43 print(lb.curselection())
44 
45 # 判斷:一個選項是否被選中
46 print(lb.selection_includes(3))
47 
48 win.mainloop()
復制代碼

 11、Listbox控件二

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 # 綁定變量
 8 lbv = tkinter.StringVar()
 9 
10 # 與BORWSE相似,但是不支持鼠標按下后移動選中位置
11 lb = tkinter.Listbox(win, selectmode=tkinter.SINGLE, listvariable=lbv)
12 lb.pack()
13 
14 for item in ["good", "nice", "handsome", "aaa", "bbb", "ccc", "ddd"]:
15     # 按順序添加
16     lb.insert(tkinter.END, item)
17 
18 # 打印當前列表中的選型
19 print(lbv.get())
20 
21 # 設置選項
22 # lbv.set(("1","2","3"))
23 
24 # 綁定事件
25 def myprint(event):
26     # print(lb.curselection()) # 返回下標
27     print(lb.get(lb.curselection())) # 返回值
28 lb.bind("<Double-Button-1>", myprint)
29 
30 win.mainloop()
復制代碼

12、Listbox控件三

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 # win.geometry("400x400+200+50")
 6 
 7 # EXTENDED:可以使listbox支持shift和Ctrl
 8 lb = tkinter.Listbox(win, selectmode=tkinter.EXTENDED)
 9 lb.pack()
10 
11 for item in ["good", "nice", "handsome", "aaa", "bbb", "ccc", "ddd", "good", "nice", "handsome", "aaa", "bbb", "ccc", "ddd", "good", "nice", "handsome", "aaa", "bbb", "ccc", "ddd", "good", "nice", "handsome", "aaa", "bbb", "ccc", "ddd", "good", "nice", "handsome", "aaa", "bbb", "ccc", "ddd"]:
12     # 按順序添加
13     lb.insert(tkinter.END, item)
14 
15 # 滾動條
16 sc = tkinter.Scrollbar(win)
17 sc.pack(side=tkinter.RIGHT, fill=tkinter.Y)
18 # 配置
19 lb.configure(yscrollcommand=sc.set)
20 lb.pack(side=tkinter.LEFT, fill=tkinter.BOTH)
21 # 額外給屬性賦值
22 sc["command"] = lb.yview
23 
24 win.mainloop()
復制代碼

13、Listbox四

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 # MULTIPLE支持多選
 8 lb = tkinter.Listbox(win, selectmode=tkinter.MULTIPLE)
 9 lb.pack()
10 
11 for item in ["good", "nice", "handsome", "aaa", "bbb", "ccc", "ddd"]:
12     # 按順序添加
13     lb.insert(tkinter.END, item)
14 
15 win.mainloop()
復制代碼

14、Scale控件

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 '''
 8 供用戶通過拖拽指示器來改變變量的值,可以水平,也可以豎直
 9 '''
10 
11 # tkinter.HORIZONTAL水平
12 # tkinter.VERTICAL 豎直(默認)
13 # length:水平時表示寬度,豎直時表示高度
14 # tickintervar :選擇值將會為該值得倍數
15 
16 scale1 = tkinter.Scale(win, from_=0, to=100, orient=tkinter.HORIZONTAL, tickinterval=10, length=200)
17 scale1.pack()
18 
19 # 設置值
20 scale1.set(20)
21 
22 # 取值
23 # print(scale1.get())
24 
25 def showNum():
26     print(scale1.get())
27 tkinter.Button(win, text="按鈕", command=showNum).pack()
28 
29 win.mainloop()
復制代碼

15、Spinbox控件

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 '''
 8 數值范圍控件
 9 '''
10 
11 # 綁定變量
12 v = tkinter.StringVar()
13 
14 def updata():
15     print(v.get())
16 
17 # increment:步長,默認為1
18 # values要輸入一個元組 最好不要和from和to同時使用,而且步長也沒用
19 # command 只要值改變就會執行updata方法
20 sp = tkinter.Spinbox(win, from_=0, to=100, increment=5,
21                      textvariable=v, command=updata)
22 # sp = tkinter.Spinbox(win, values=(0,2,4,6,8))
23 sp.pack()
24 
25 # 賦值
26 v.set(20)
27 # 取值
28 print(v.get())
29 
30 win.mainloop()
復制代碼

16、Menu頂層菜單

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 # 菜單條
 8 menubar = tkinter.Menu(win)
 9 win.config(menu=menubar)
10 
11 def func():
12     print("**********")
13 
14 # 創建一個菜單選項
15 menu1 = tkinter.Menu(menubar, tearoff=False)
16 
17 # 給菜單選項添加內容
18 for item in ['python','c','java','c++', 'c#','php','B','退出']:
19     if item == '退出':
20         # 添加分割線
21         menu1.add_separator()
22         menu1.add_command(label=item, command=win.quit)
23     else:
24         menu1.add_command(label=item, command=func)
25 
26 # 向菜單條上添加菜單選項
27 menubar.add_cascade(label='語言', menu=menu1)
28 
29 win.mainloop()
復制代碼

17、Menu鼠標右鍵菜單

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 # 菜單條
 8 menubar = tkinter.Menu(win)
 9 
10 def func():
11     print("**********")
12 
13 # 菜單
14 menu = tkinter.Menu(menubar, tearoff=False)
15 # 給菜單選項添加內容
16 for item in ['python','c','java','c++', 'c#','php','B','退出']:
17     if item == '退出':
18         # 添加分割線
19         menu.add_separator()
20         menu.add_command(label=item, command=win.quit)
21     else:
22         menu.add_command(label=item, command=func)
23 
24 menubar.add_cascade(label="語言", menu=menu)
25 
26 def showMenu(event):
27     menubar.post(event.x_root, event.y_root)
28 
29 win.bind("<Button-3>", showMenu)
30 
31 win.mainloop()
復制代碼

18、Combobox下拉控件

復制代碼
 1 import tkinter
 2 from tkinter import ttk
 3 
 4 win = tkinter.Tk()
 5 win.title("yudanqu")
 6 win.geometry("400x400+200+50")
 7 
 8 # 綁定變量
 9 cv = tkinter.StringVar()
10 
11 com = ttk.Combobox(win, textvariable=cv)
12 com.pack()
13 
14 # 設置下拉數據
15 com["value"] = ("黑龍江", "吉林", "遼寧")
16 
17 # 設置默認值
18 com.current(0)
19 
20 # 綁定事件
21 
22 def func(event):
23     print(com.get())
24     print(cv.get())
25 com.bind("<<ComboboxSelected>>", func)
26 
27 win.mainloop()
復制代碼

19、Frame控件

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 '''
 8 框架控件:在桌面上顯示一個矩形區域,多作為一個容器控件
 9 '''
10 
11 frm = tkinter.Frame(win)
12 frm.pack()
13 
14 # left
15 frm_l = tkinter.Frame(frm)
16 tkinter.Label(frm_l, text="左上", bg="pink").pack(side=tkinter.TOP)
17 tkinter.Label(frm_l, text="左下", bg="blue").pack(side=tkinter.TOP)
18 frm_l.pack(side=tkinter.LEFT)
19 
20 # right
21 frm_r = tkinter.Frame(frm)
22 tkinter.Label(frm_r, text="右上", bg="green").pack(side=tkinter.TOP)
23 tkinter.Label(frm_r, text="右下", bg="red").pack(side=tkinter.TOP)
24 frm_r.pack(side=tkinter.RIGHT)
25 
26 win.mainloop()
復制代碼

20、表格數據

復制代碼
 1 import tkinter
 2 from tkinter import ttk
 3 
 4 win = tkinter.Tk()
 5 win.title("yudanqu")
 6 win.geometry("600x400+200+50")
 7 
 8 # 表格
 9 tree = ttk.Treeview(win)
10 tree.pack()
11 
12 # 定義列
13 tree["columns"] = ("姓名","年齡","身高","體重")
14 # 設置列,列還不顯示
15 tree.column("姓名", width=100)
16 tree.column("年齡", width=100)
17 tree.column("身高", width=100)
18 tree.column("體重", width=100)
19 
20 # 設置表頭
21 tree.heading("姓名", text="姓名-name")
22 tree.heading("年齡", text="年齡-age")
23 tree.heading("身高", text="身高-height")
24 tree.heading("體重", text="體重-weight")
25 
26 # 添加數據
27 tree.insert("", 0, text="line1", values=("小鄭","34","177cm","70kg"))
28 tree.insert("", 1, text="line2", values=("小張","43","188cm","90kg"))
29 
30 win.mainloop()
復制代碼

21、樹狀數據

復制代碼
 1 import tkinter
 2 from tkinter import ttk
 3 
 4 win = tkinter.Tk()
 5 win.title("yudanqu")
 6 win.geometry("400x400+200+50")
 7 
 8 tree = ttk.Treeview(win)
 9 tree.pack()
10 
11 # 添加一級樹枝
12 treeF1 = tree.insert("",0,"中國",text= "中國Chi", values=("F1"))
13 treeF2 = tree.insert("",1,"美國",text= "美國USA", values=("F1"))
14 treeF3 = tree.insert("",2,"英國",text= "英國UK", values=("F1"))
15 
16 # 二級樹枝
17 treeF1_1 = tree.insert(treeF1,0,"黑龍江",text="中國黑龍江",values=("F1_1"))
18 treeF1_2 = tree.insert(treeF1,1,"吉林",text="中國吉林",values=("F1_2"))
19 treeF1_3 = tree.insert(treeF1,2,"遼寧",text="中國遼寧",values=("F1_3"))
20 
21 treeF2_1 = tree.insert(treeF2,0,"aaa",text="aaaa",values=("F2_1"))
22 treeF2_2 = tree.insert(treeF2,1,"bbb",text="bbbb",values=("F2_2"))
23 treeF2_3 = tree.insert(treeF2,2,"ccc",text="cccc",values=("F2_3"))
24 
25 # 三級樹枝
26 treeF1_1_1 = tree.insert(treeF1_1,0,"哈爾濱",text="黑龍江哈爾濱")
27 treeF1_1_2 = tree.insert(treeF1_1,1,"五常",text="黑龍江五常")
28 
29 win.mainloop()
復制代碼

22、絕對布局

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 label1 = tkinter.Label(win, text="good", bg="blue")
 8 label2 = tkinter.Label(win, text="nice", bg="red")
 9 label3 = tkinter.Label(win, text="cool", bg="green")
10 
11 # 絕對布局,窗口的變化對位置沒有影響
12 label1.place(x=10,y=10)
13 label2.place(x=50,y=50)
14 label3.place(x=100,y=100)
15 
16 win.mainloop()
復制代碼

23、相對布局

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 label1 = tkinter.Label(win, text="good", bg="blue")
 8 label2 = tkinter.Label(win, text="nice", bg="red")
 9 label3 = tkinter.Label(win, text="cool", bg="green")
10 
11 # 相對布局,窗體改變對控件有影響
12 label1.pack(fill=tkinter.Y, side=tkinter.LEFT)
13 label2.pack(fill=tkinter.X, side=tkinter.TOP)
14 label3.pack()
15 
16 win.mainloop()
復制代碼

24、表格布局

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 label1 = tkinter.Label(win, text="good", bg="blue")
 8 label2 = tkinter.Label(win, text="nice", bg="red")
 9 label3 = tkinter.Label(win, text="cool", bg="green")
10 label4 = tkinter.Label(win, text="handsome", bg="yellow")
11 
12 # 表格布局
13 label1.grid(row=0,column=0)
14 label2.grid(row=0,column=1)
15 label3.grid(row=1,column=0)
16 label4.grid(row=1,column=1)
17 
18 win.mainloop()
復制代碼

25、鼠標點擊事件

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 
 8 def func(event):
 9     print(event.x, event.y)
10 
11 # <Button-1>  鼠標左鍵
12 # <Button-2>  鼠標滾輪
13 # <Button-1>  鼠標右鍵
14 # <Double-Button-1>  鼠標雙擊左鍵
15 # <Triple-Button-1>  鼠標三擊左鍵
16 
17 button1 = tkinter.Button(win, text="leftmouse button")
18 # bind 給控件綁定數據(參數一是綁定的事件,參數二是觸發事件的函數)
19 button1.bind("<Button-1>", func)
20 button1.pack()
21 
22 win.mainloop()
復制代碼

26、鼠標移動事件

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 
 8 # <B1-Motion>  左鍵移動
 9 # <B2-Motion>  中鍵移動
10 # <B3-Motion>  右鍵移動
11 
12 
13 label = tkinter.Label(win, text="*********")
14 label.pack()
15 
16 def func(event):
17     print(event.x, event.y)
18 
19 label.bind("<B1-Motion>", func)
20 
21 win.mainloop()
復制代碼

27、鼠標釋放事件

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 # <ButtonRelease-1> 釋放鼠標左鍵
 8 # <ButtonRelease-2> 釋放鼠標中鍵
 9 # <ButtonRelease-3> 釋放鼠標右鍵
10 
11 
12 label = tkinter.Label(win, text="*********", bg="red")
13 label.pack()
14 
15 def func(event):
16     print(event.x, event.y)
17 
18 label.bind("<ButtonRelease-1>", func)
19 
20 win.mainloop()
復制代碼

28、進入和離開事件

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 # <Enter>  當鼠標進入控件時觸發事件
 8 # <Leave>  當鼠標離開控件時觸發事件
 9 
10 label = tkinter.Label(win, text="*********", bg="red")
11 label.pack()
12 
13 def func(event):
14     print(event.x, event.y)
15 
16 label.bind("<Enter>", func)
17 label.bind("<Leave>", func)
18 
19 
20 win.mainloop()
復制代碼

29、響應所有按鍵的事件

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 # <Key>  響應所有的按鍵(要有焦點)
 8 
 9 label = tkinter.Label(win, text="*********", bg="red")
10 # 設置焦點
11 label.focus_set()
12 label.pack()
13 
14 def func(event):
15     print("event.char=", event.char)
16     print("event.keycode=", event.keycode)
17 
18 label.bind("<Key>", func)
19 
20 win.mainloop()
復制代碼

30、響應特殊按鍵事件

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 # <Shift_L>  只響應左側的shift鍵
 8 # <Shift_R>
 9 # <F5>
10 # <Return>  也就是回車鍵
11 # <BackSpace>  返回,也就是退格鍵
12 
13 label = tkinter.Label(win, text="*********", bg="red")
14 # 設置焦點
15 label.focus_set()
16 label.pack()
17 
18 def func(event):
19     print("event.char=", event.char)
20     print("event.keycode=", event.keycode)
21 
22 
23 label.bind("<Shift_L>", func)
24 
25 
26 win.mainloop()
復制代碼

31、指定按鍵事件

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 
 8 label = tkinter.Label(win, text="*********", bg="red")
 9 # 設置焦點
10 label.focus_set()
11 label.pack()
12 
13 def func(event):
14     print("event.char=", event.char)
15     print("event.keycode=", event.keycode)
16 
17 
18 win.bind("a", func) # 注意前面改成了win,只需要寫出按鍵名即可
19 
20 
21 win.mainloop()
復制代碼

32、組合按鍵事件

復制代碼
 1 import tkinter
 2 
 3 win = tkinter.Tk()
 4 win.title("yudanqu")
 5 win.geometry("400x400+200+50")
 6 
 7 
 8 # <Control-Alt-a>
 9 # <Shift-Up>
10 # 只是control+alt不行
11 
12 label = tkinter.Label(win, text="*********", bg="red")
13 # 設置焦點
14 label.focus_set()
15 label.pack()
16 
17 def func(event):
18     print("event.char=", event.char)
19     print("event.keycode=", event.keycode)
20 
21 
22 win.bind("<Control-Alt-a>", func) # 注意前面改成了win,只需要寫出按鍵名即可
23 
24 
25 win.mainloop()

 

四、綜合練習,用戶登錄窗口例子

  編寫一個用戶登錄界面,用戶可以登錄賬戶信息,如果賬戶已經存在,可以直接登錄,登錄名或者登錄密碼輸入錯誤會提示,如果賬戶不存在,提示用戶注冊,點擊注冊進去注冊頁面,輸入注冊信息,確定后便可以返回登錄界面進行登錄。

  示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛
 
import  tkinter as tk   # 使用Tkinter前需要先導入
import  tkinter.messagebox
import  pickle
 
# 第1步,實例化object,建立窗口window
window  =  tk.Tk()
 
# 第2步,給窗口的可視化起名字
window.title( 'Wellcome to Hongwei Website' )
 
# 第3步,設定窗口的大小(長 * 寬)
window.geometry( '400x300' )   # 這里的乘是小x
 
# 第4步,加載 wellcome image
canvas  =  tk.Canvas(window, width = 400 , height = 135 , bg = 'green' )
image_file  =  tk.PhotoImage( file = 'pic.gif' )
image  =  canvas.create_image( 200 0 , anchor = 'n' , image = image_file)
canvas.pack(side = 'top' )
tk.Label(window, text = 'Wellcome' ,font = ( 'Arial' 16 )).pack()
 
# 第5步,用戶信息
tk.Label(window, text = 'User name:' , font = ( 'Arial' 14 )).place(x = 10 , y = 170 )
tk.Label(window, text = 'Password:' , font = ( 'Arial' 14 )).place(x = 10 , y = 210 )
 
# 第6步,用戶登錄輸入框entry
# 用戶名
var_usr_name  =  tk.StringVar()
var_usr_name. set ( 'example@python.com' )
entry_usr_name  =  tk.Entry(window, textvariable = var_usr_name, font = ( 'Arial' 14 ))
entry_usr_name.place(x = 120 ,y = 175 )
# 用戶密碼
var_usr_pwd  =  tk.StringVar()
entry_usr_pwd  =  tk.Entry(window, textvariable = var_usr_pwd, font = ( 'Arial' 14 ), show = '*' )
entry_usr_pwd.place(x = 120 ,y = 215 )
 
# 第8步,定義用戶登錄功能
def  usr_login():
     # 這兩行代碼就是獲取用戶輸入的usr_name和usr_pwd
     usr_name  =  var_usr_name.get()
     usr_pwd  =  var_usr_pwd.get()
 
     # 這里設置異常捕獲,當我們第一次訪問用戶信息文件時是不存在的,所以這里設置異常捕獲。
     # 中間的兩行就是我們的匹配,即程序將輸入的信息和文件中的信息匹配。
     try :
         with  open ( 'usrs_info.pickle' 'rb' ) as usr_file:
             usrs_info  =  pickle.load(usr_file)
     except  FileNotFoundError:
         # 這里就是我們在沒有讀取到`usr_file`的時候,程序會創建一個`usr_file`這個文件,並將管理員
         # 的用戶和密碼寫入,即用戶名為`admin`密碼為`admin`。
         with  open ( 'usrs_info.pickle' 'wb' ) as usr_file:
             usrs_info  =  { 'admin' 'admin' }
             pickle.dump(usrs_info, usr_file)
             usr_file.close()     # 必須先關閉,否則pickle.load()會出現EOFError: Ran out of input
 
     # 如果用戶名和密碼與文件中的匹配成功,則會登錄成功,並跳出彈窗how are you? 加上你的用戶名。
     if  usr_name  in  usrs_info:
         if  usr_pwd  = =  usrs_info[usr_name]:
             tkinter.messagebox.showinfo(title = 'Welcome' , message = 'How are you? '  +  usr_name)
         # 如果用戶名匹配成功,而密碼輸入錯誤,則會彈出'Error, your password is wrong, try again.'
         else :
             tkinter.messagebox.showerror(message = 'Error, your password is wrong, try again.' )
     else :   # 如果發現用戶名不存在
         is_sign_up  =  tkinter.messagebox.askyesno( 'Welcome! ' 'You have not sign up yet. Sign up now?' )
         # 提示需不需要注冊新用戶
         if  is_sign_up:
             usr_sign_up()
 
# 第9步,定義用戶注冊功能
def  usr_sign_up():
     def  sign_to_Hongwei_Website():
         # 以下三行就是獲取我們注冊時所輸入的信息
         np  =  new_pwd.get()
         npf  =  new_pwd_confirm.get()
         nn  =  new_name.get()
 
         # 這里是打開我們記錄數據的文件,將注冊信息讀出
         with  open ( 'usrs_info.pickle' 'rb' ) as usr_file:
             exist_usr_info  =  pickle.load(usr_file)
         # 這里就是判斷,如果兩次密碼輸入不一致,則提示Error, Password and confirm password must be the same!
         if  np ! =  npf:
             tkinter.messagebox.showerror( 'Error' 'Password and confirm password must be the same!' )
 
         # 如果用戶名已經在我們的數據文件中,則提示Error, The user has already signed up!
         elif  nn  in  exist_usr_info:
             tkinter.messagebox.showerror( 'Error' 'The user has already signed up!' )
 
         # 最后如果輸入無以上錯誤,則將注冊輸入的信息記錄到文件當中,並提示注冊成功Welcome!,You have successfully signed up!,然后銷毀窗口。
         else :
             exist_usr_info[nn]  =  np
             with  open ( 'usrs_info.pickle' 'wb' ) as usr_file:
                 pickle.dump(exist_usr_info, usr_file)
             tkinter.messagebox.showinfo( 'Welcome' 'You have successfully signed up!' )
             # 然后銷毀窗口。
             window_sign_up.destroy()
 
     # 定義長在窗口上的窗口
     window_sign_up  =  tk.Toplevel(window)
     window_sign_up.geometry( '300x200' )
     window_sign_up.title( 'Sign up window' )
 
     new_name  =  tk.StringVar()   # 將輸入的注冊名賦值給變量
     new_name. set ( 'example@python.com' )   # 將最初顯示定為'example@python.com'
     tk.Label(window_sign_up, text = 'User name: ' ).place(x = 10 , y = 10 )   # 將`User name:`放置在坐標(10,10)。
     entry_new_name  =  tk.Entry(window_sign_up, textvariable = new_name)   # 創建一個注冊名的`entry`,變量為`new_name`
     entry_new_name.place(x = 130 , y = 10 )   # `entry`放置在坐標(150,10).
 
     new_pwd  =  tk.StringVar()
     tk.Label(window_sign_up, text = 'Password: ' ).place(x = 10 , y = 50 )
     entry_usr_pwd  =  tk.Entry(window_sign_up, textvariable = new_pwd, show = '*' )
     entry_usr_pwd.place(x = 130 , y = 50 )
 
     new_pwd_confirm  =  tk.StringVar()
     tk.Label(window_sign_up, text = 'Confirm password: ' ).place(x = 10 , y = 90 )
     entry_usr_pwd_confirm  =  tk.Entry(window_sign_up, textvariable = new_pwd_confirm, show = '*' )
     entry_usr_pwd_confirm.place(x = 130 , y = 90 )
 
     # 下面的 sign_to_Hongwei_Website
     btn_comfirm_sign_up  =  tk.Button(window_sign_up, text = 'Sign up' , command = sign_to_Hongwei_Website)
     btn_comfirm_sign_up.place(x = 180 , y = 120 )
 
# 第7步,login and sign up 按鈕
btn_login  =  tk.Button(window, text = 'Login' , command = usr_login)
btn_login.place(x = 120 , y = 240 )
btn_sign_up  =  tk.Button(window, text = 'Sign up' , command = usr_sign_up)
btn_sign_up.place(x = 200 , y = 240 )
 
# 第10步,主窗口循環顯示
window.mainloop()

  測試效果:



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM