1. 程式人生 > 程式設計 >Python GUI之tkinter視窗視窗教程大集合(推薦)

Python GUI之tkinter視窗視窗教程大集合(推薦)

一、前言

  由於本篇文章較長,所以下面給出內容目錄方便跳轉閱讀,當然也可以用部落格頁面最右側的文章目錄導航欄進行跳轉查閱。

二、Tkinter是什麼

  Tkinter 是使用 python 進行視窗視窗設計的模組。Tkinter模組("Tk 介面")是Python的標準Tk GUI工具包的介面。作為python 特定的GUI介面,是一個影象的視窗,tkinter是python 自帶的,可以編輯的GUI介面,我們可以用GUI 實現很多直觀的功能,比如想開發一個計算器,如果只是一個程式輸入,輸出視窗的話,是沒用使用者體驗的。所有開發一個影象化的小視窗,就是必要的。

  對於稍有GUI程式設計經驗的人來說,Python的Tkinter介面庫是非常簡單的。python的GUI庫非常多,選擇Tkinter,一是最為簡單,二是自帶庫,不需下載安裝,隨時使用,三則是從需求出發,Python作為一種指令碼語言,一種膠水語言,一般不會用它來開發複雜的桌面應用,它並不具備這方面的優勢,使用Python,可以把它作為一個靈活的工具,而不是作為主要開發語言,那麼在工作中,需要製作一個小工具,肯定是需要有介面的,不僅自己用,也能分享別人使用,在這種需求下,Tkinter是足夠勝任的!

  這篇文章主要做一個簡單概述和實踐程式設計,對於從沒有接觸過GUI的新手,在腦中樹立一個基本的介面程式設計概念,同時自己也能學會如何簡單的實現一些小的圖形視窗功能。

  對於Tkinter程式設計,可以用兩個比喻來理解:

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

三、Tkinter 控制元件詳細介紹

1. Tkinter 模組元素簡要說明

Python GUI之tkinter視窗視窗教程大集合(推薦)

The Button Widget
The Canvas Widget
The Checkbutton Widget
The Entry Widget
The Frame Widget
The Label Widget
The LabelFrame Widget
The Listbox Widget
The Menu Widget
The Menubutton Widget
The Message Widget
The OptionMenu Widget
The PanedWindow Widget
The Radiobutton Widget

The Scale Widget
The Scrollbar Widget
The Spinbox Widget
The Text Widget
The Toplevel Widget
Basic Widget Methods
Toplevel Window Methods

2. 常用視窗部件及簡要說明:

  Tkinter支援16個核心的視窗部件,這個16個核心視窗部件類簡要描述如下:

Button:一個簡單的按鈕,用來執行一個命令或別的操作。

Canvas:組織圖形。這個部件可以用來繪製圖表和圖,建立圖形編輯器,實現定製視窗部件。

Checkbutton:代表一個變數,它有兩個不同的值。點選這個按鈕將會在這兩個值間切換。

Entry:文字輸入域。

Frame:一個容器視窗部件。幀可以有邊框和背景,當建立一個應用程式或dialog(對話)版面時,幀被用來組織其它的視窗部件。

Label:顯示一個文字或圖象。

Listbox:顯示供選方案的一個列表。listbox能夠被配置來得到radiobutton或checklist的行為。

Menu:選單條。用來實現下拉和彈出式選單。

Menubutton:選單按鈕。用來實現下拉式選單。

Message:顯示一文字。類似label視窗部件,但是能夠自動地調整文字到給定的寬度或比率。

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

Scale:允許你通過滑塊來設定一數字值。

Scrollbar:為配合使用canvas,entry,listbox,and text視窗部件的標準滾動條。

Text:格式化文字顯示。允許你用不同的樣式和屬性來顯示和編輯文字。同時支援內嵌圖象和視窗。

Toplevel:一個容器視窗部件,作為一個單獨的、最上面的視窗顯示。

messageBox:訊息框,用於顯示你應用程式的訊息框。(Python2中為tkMessagebox)

注意在Tkinter中視窗部件類沒有分級;所有的視窗部件類在樹中都是兄弟關係。

所有這些視窗部件提供了Misc和幾何管理方法、配置管理方法和部件自己定義的另外的方法。此外,Toplevel類也提供視窗管理介面。這意味一個典型的視窗部件類提供了大約150種方法。

四、動手實踐學習

1. 建立主視窗及Label部件(標籤)建立使用

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

  示例程式碼:

#!/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步,在圖形介面上設定標籤
l = 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是視窗檔案的關鍵的關鍵。

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)

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)

  示例程式碼:

#!/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函式的傳出內容用以顯示在標籤上
l = tk.Label(window,textvariable=var,fg='white',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按鍵
b = tk.Button(window,text='hit me',width=10,height=1,command=hit_me)
b.pack()
 
# 第6步,主視窗迴圈顯示
window.mainloop()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)Python GUI之tkinter視窗視窗教程大集合(推薦)

3. Entry視窗部件

  簡單說明:  

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

  什麼時候用:

  需要使用者輸入使用者資訊時,比如我們平時使用軟體、登入網頁時,使用者互動介面讓我們登入賬戶資訊等時候可以用到。

  示例程式碼:

#!/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='*',14))  # 顯示成密文形式
e2 = tk.Entry(window,show=None,14)) # 顯示成明文形式
e1.pack()
e2.pack()
 
# 第5步,主視窗迴圈顯示
window.mainloop()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)

4. Text視窗部件

  簡單說明:  

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

  什麼時候用:

  在需要顯示編輯使用者、產品多行資訊時,比如顯示使用者詳細描述文字,產品簡介等等,支援隨時編輯。

  示例程式碼:

#!/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框並放置
e = 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',height=2,command=insert_point)
b1.pack()
b2 = tk.Button(window,text='insert end',command=insert_end)
b2.pack()
 
# 第7步,建立並放置一個多行文字框text用以顯示,指定height=3為文字框是三個字元高度
t = tk.Text(window,height=3)
t.pack()
 
# 第8步,主視窗迴圈顯示
window.mainloop()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)

5. Listbox視窗部件

  簡單說明:  

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

  什麼時候用:

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

  示例程式碼:

#!/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用來接收滑鼠點選具體選項的內容
l = tk.Label(window,fg='yellow',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,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()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)

6. Radiobutton視窗部件

  簡單說明:  

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

  什麼時候用:

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

  示例程式碼:

#!/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的值聯絡在一起.
l = 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',value='B',command=print_selection)
r2.pack()
r3 = tk.Radiobutton(window,text='Option C',value='C',command=print_selection)
r3.pack()
 
# 第7步,主視窗迴圈顯示
window.mainloop()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)Python GUI之tkinter視窗視窗教程大集合(推薦)

7.Checkbutton視窗部件

  簡單說明:  

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

  什麼時候用:

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

  示例程式碼:

#!/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用以顯示並放置
l = tk.Label(window,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,command=print_selection)
c2.pack()
 
# 第7步,主視窗迴圈顯示
window.mainloop()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)Python GUI之tkinter視窗視窗教程大集合(推薦)Python GUI之tkinter視窗視窗教程大集合(推薦)

8.Scale視窗部件

  簡單說明:  

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

  什麼時候用:

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

  示例程式碼:

#!/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用以顯示並放置
l = tk.Label(window,text='empty')
l.pack()
 
# 第6步,定義一個觸發函式功能
def print_selection(v):
  l.config(text='you have selected ' + v)
# 第5步,建立一個尺度滑條,長度200字元,從0開始10結束,以2為刻度,精度為0.01,觸發呼叫print_selection函式
s = 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()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)Python GUI之tkinter視窗視窗教程大集合(推薦)

9.Canvas視窗部件

  簡單說明:  

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

  什麼時候用:

  在比如像使用者互動介面等,需要提供設計的圖示、圖形、logo等資訊是可以用到畫布。

  示例程式碼:

#!/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,height=200,width=500)
# 說明圖片位置,並匯入圖片到畫布上
image_file = tk.PhotoImage(file='pic.gif') # 圖片位置(相對路徑,與.py檔案同一資料夾下,也可以用絕對路徑,需要給定圖片具體絕對路徑)
image = canvas.create_image(250,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,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) # 移動正方形rect(也可以改成其他圖形名字用以移動一起圖形、元素),按每次(x=2,y=2)步長進行移動
 
# 第5步,定義一個按鈕用來移動指定圖形的在畫布上的位置
b = tk.Button(window,text='move item',command=moveit).pack()
 
# 第7步,主視窗迴圈顯示
window.mainloop()

  所用圖片:

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

Python GUI之tkinter視窗視窗教程大集合(推薦)

  圖片錨定點位置引數圖:

Python GUI之tkinter視窗視窗教程大集合(推薦)

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)Python GUI之tkinter視窗視窗教程大集合(推薦)

10.Menu視窗部件

  簡單說明:  

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

  什麼時候用:

  在比如像軟體或網頁互動介面等,需要提供選單選項功能提供使用者選擇選單選項功能時用到。

  示例程式碼:

#!/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步,在圖形介面上建立一個標籤用以顯示內容並放置
l = 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()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)

11.Frame視窗部件

  簡單說明:  

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

  什麼時候用:

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

  示例程式碼:

#!/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',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',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',text='on the frame_r3',bg='yellow').pack()
 
# 第8步,主視窗迴圈顯示
window.mainloop()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)

12.messageBox視窗部件

  簡單說明:  

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

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'

  什麼時候用:

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

  示例程式碼:

#!/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','no'
  # print(tkinter.messagebox.askyesno(title='Hi','False'
  # print(tkinter.messagebox.askokcancel(title='Hi','False'
 
# 第4步,在圖形介面上建立一個標籤用以顯示內容並放置
tk.Button(window,14),command=hit_me).pack()
 
# 第6步,主視窗迴圈顯示
window.mainloop()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)Python GUI之tkinter視窗視窗教程大集合(推薦)

Python GUI之tkinter視窗視窗教程大集合(推薦)Python GUI之tkinter視窗視窗教程大集合(推薦)

13. 視窗部件三种放置方式pack/grid/place

  參考來源:

The Grid Geometry Manager
The Pack Geometry Manager
The Place Geometry Manager

  1. Grid:The Grid Geometry Manager  

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

for i in range(3):
  for j 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是單元格內部元素與單元格的上下間距。

  示例程式碼:

#!/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 i in range(3):
  for j in range(3):
    tk.Label(window,ipady=10)
 
# 第5步,主視窗迴圈顯示
window.mainloop()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)

  2. Pack:The Pack Geometry Manager

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

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

   示例程式碼:

#!/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,fg='red').pack(side='right') # 右
 
# 第5步,主視窗迴圈顯示
window.mainloop()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)

  3. Place:The Place Geometry Manager

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

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

  示例程式碼:

#!/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,anchor='nw')
 
# 第5步,主視窗迴圈顯示
window.mainloop()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)

14. 綜合練習,使用者登入視窗例子

  編寫一個使用者登入介面,使用者可以登入賬戶資訊,如果賬戶已經存在,可以直接登入,登入名或者登入密碼輸入錯誤會提示,如果賬戶不存在,提示使用者註冊,點選註冊進去註冊頁面,輸入註冊資訊,確定後便可以返回登入介面進行登入。

  示例程式碼:

#!/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,image=image_file)
canvas.pack(side='top')
tk.Label(window,text='Wellcome',16)).pack()
 
# 第5步,使用者資訊
tk.Label(window,text='User name:',14)).place(x=10,y=170)
tk.Label(window,text='Password:',y=210)
 
# 第6步,使用者登入輸入框entry
# 使用者名稱
var_usr_name = tk.StringVar()
var_usr_name.set('[email protected]')
entry_usr_name = tk.Entry(window,textvariable=var_usr_name,14))
entry_usr_name.place(x=120,y=175)
# 使用者密碼
var_usr_pwd = tk.StringVar()
entry_usr_pwd = tk.Entry(window,textvariable=var_usr_pwd,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,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('[email protected]') # 將最初顯示定為'[email protected]'
  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,command=usr_sign_up)
btn_sign_up.place(x=200,y=240)
 
# 第10步,主視窗迴圈顯示
window.mainloop()

  測試效果:

Python GUI之tkinter視窗視窗教程大集合(推薦)Python GUI之tkinter視窗視窗教程大集合(推薦)

15. 其他部件後續再補充...

注:不同電腦可能配置環境略有不同,如有小錯誤可以自己除錯一下。

到此這篇關於Python GUI之tkinter視窗視窗教程大集合的文章就介紹到這了,更多相關Python tkinter視窗視窗內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!