Tkinter入門簡明教程


本文我們將學習如何使用Tkinter包編寫一些圖形用戶界面程序。Tkinter是Python的一個標准包,因此我們並不需要安裝它。我們將從創建一個窗口開始,然后我們在其之上加入一些小組件,比如按鈕,復選框等,並使用它們的一些屬性。話不多說,讓我們開始吧!

創建一個窗口
首先,我們導入Tkinter包,然后創建一個窗口,最后給這個窗口設置標題。

from tkinter import *

window = Tk()
window.title("First Window")
window.mainloop()

  

結果如下:

 

最后一行我們調用了mainloop函數,這個函數將讓窗口等待用戶與之交互,直到我們關閉它。如果忘記調用mainloop函數的話,將不會向用戶顯示任何內容(沒有窗口)。

添加一個標簽組件
為了給之前的例子增加一個標簽組件,我們可以使用Label類:

lbl = Label(window, text="Hello")

我們可以通過grid函數設置其在窗口的位置:

lbl.grid(column=0, row=0)

完整代碼如下所示:

from tkinter import *

window = Tk()
window.title("First Window")
lbl = Label(window, text="Hello")
lbl.grid(column=0, row=0)
window.mainloop()

結果如下:

 

值得注意的是lbl沒有調用grid函數的話是不會顯示的。

設置標簽字體大小
我們可以使用font參數設置標簽字體大小:

lbl = Label(window, text="Hello", font=("Arial Bold", 50))

font參數不光可以在標簽組件中用,其他組件也可以使用呢!

可是,現在窗口貌似太小了,連窗口的標題都看不全,如何設置窗口大小呢?

設置窗口大小
我們可以用geometry函數來設置窗口大小:

window.geometry("350x200")

以上代碼將會把窗口設置成350個像素寬,200個像素高。

添加一個按鈕組件
讓我們給窗口增加一個按鈕組件,它的創建和添加方式和標簽組件差不多:

btn = Button(window, text="Click Me")
btn.grid(column=1, row=0)

完整代碼如下所示:

from tkinter import *

window = Tk()
window.title("First Window")
window.geometry("350x200")
lbl = Label(window, text="Hello")
lbl.grid(column=0, row=0)
btn = Button(window, text="Click Me")
btn.grid(column=1, row=0)
window.mainloop()

結果如下:

 

#### 更改按鈕前景和背景顏色

我們可以用fg參數設置按鈕或其他組件的前景色。

我們可以用bg參數設置按鈕或其他組件的背景色。

btn = Button(window, text="Click Me", bg="orange", fg="red")

現在,如果點擊按鈕,什么都不會發生,因為我們沒有寫處理點擊事件的代碼。

處理按鈕點擊事件
首先,我們編寫一個當按鈕點擊后需要執行的函數:

def clicked():
  lbl.configure(text="Button was clicked!")

然后,我們注明一下點擊時要調用的函數:

btn = Button(window, text="Click Me", command=clicked)

完整代碼如下所示:

from tkinter import *

window = Tk()
window.title("First Window")
window.geometry("350x200")
lbl = Label(window, text="Hello")
lbl.grid(column=0, row=0)

def clicked():
    lbl.configure(text="Button was clicked!")

btn = Button(window, text="Click Me", command=clicked)
btn.grid(column=1, row=0)
window.mainloop()

當我們點擊按鈕后,結果如下:

 

添加一個文本框
在之前的例子中我們了解了如何添加一些簡單組件,現在我們將通過Tkinter的Entry類獲取到用戶輸入。我們可以這樣用Entry類創建一個文本框:

txt = Entry(window, width=10)

然后可以用grid函數像之前那樣添加到窗口中。

from tkinter import *

window = Tk()
window.title("First Window")
window.geometry("350x200")
lbl = Label(window, text="Hello")
lbl.grid(column=0, row=0)
txt = Entry(window, width=10)
txt.grid(column=1, row=0)
def clicked():
  lbl.configure(text="Button was clicked!")

btn = Button(window, text="Click Me", command=clicked)
btn.grid(column=2, row=0)
window.mainloop()

 

此時點擊按鈕,標簽組件內的內容沒有變化,如何將文本框中輸入的信息在標簽組件中顯示呢?

我們可以用get函數獲取到文本框中輸入的信息,然后如下更改clicked函數來設置窗口大小:

def clicked():
  res = "Welcome to " + txt.get()
  lbl.configure(text=res)

  


如果我們在文本框中輸入信息並點擊按鈕組件,標簽組件將會顯示Welcome to 文本框輸入信息 。

以下是完整代碼:

from tkinter import *

window = Tk()
window.title("First Window")
window.geometry("350x200")
lbl = Label(window, text="Hello")
lbl.grid(column=0, row=0)
txt = Entry(window, width=10)
txt.grid(column=1, row=0)
def clicked():
    res = "Welcome to " + txt.get()
    lbl.configure(text=res)

btn = Button(window, text="Click Me", command=clicked)
btn.grid(column=2, row=0)
window.mainloop()

運行結果為:

但每次我們運行代碼后,我們都需要通過點擊文本框來設置輸入焦點才能輸入信息,有什么辦法可以自動設置輸入焦點嗎?

設置輸入焦點
很簡單,我們只需要調用focus函數來設置窗口大小:

txt.focus()

當我們運行代碼后,會發現可以直接在文本框中輸入信息而不需要點擊文本框。

添加一個組合框
為了添加一個組合框,可以使用Combobox類:

from tkinter.ttk import *
combo = Combobox(window)

然后可以給組合框添加一些值。

from tkinter import *
from tkinter.ttk import *

window = Tk()
window.title("First Window")
window.geometry("350x200")
combo = Combobox(window)
combo['values'] = (1,2,3,4,5,"Text")
combo.current(1)
combo.grid(column=0, row=0)
window.mainloop()

 

 

 

如上所示,我們可以用元組設置組合框選項。

我們可以通過傳遞期望被選中選項的索引給current函數用以設置被選中的選項。

我們可以通過get函數獲取到被選中的選項。

combo.get()

添加復選框
我們可以用Checkbutton類來創建一個復選框組件:

chk = Checkbutton(window, text="Choose")

能通過傳遞值設置復選框的狀態:

from tkinter import *
from tkinter.ttk import *

window = Tk()
window.title("First Window")
window.geometry("350x200")
chk_state = BooleanVar()
chk_state.set(True) # Set check state
chk = Checkbutton(window, text="Choose", var=chk_state)
chk.grid(column=0, row=0)
window.mainloop()

  

 

 

上例我們用的是BooleanVar變量用來設置復選框的狀態,也可以使用IntVar變量進行設置。

chk_state = IntVar()
chk_state.set(1) # Check
chk_state.set(0) # Uncheck

結果和用BooleanVar一樣。

添加單選框
添加單選框可以用Radiobutton類創建一個文本框:

rad1 = Radiobutton(window, text="First", value=1)

我們需要給每個單選框設置不同的值,否則會不起作用。

from tkinter import *
from tkinter.ttk import *

window = Tk()
window.title("First Window")
window.geometry("350x200")
rad1 = Radiobutton(window, text="First", value=1)
rad2 = Radiobutton(window, text="Second", value=2)
rad3 = Radiobutton(window, text="Third", value=3)
rad1.grid(column=0, row=0)
rad2.grid(column=1, row=0)
rad3.grid(column=2, row=0)
window.mainloop()

 

 

 

當然,我們可以給這些單選框設置command參數指定一個函數,當用戶點擊它們時就會運行該函數。

rad1 = Radiobutton(window, text="First", value=1, command=clicked)

def clicked():
# Do what you need
  pass

  

獲取單選框值
為獲取到選中單選框的值,我們可以將IntVar變量傳給單選框的variable參數,之后用IntVar變量的get函數就可以獲取到其值啦!

from tkinter import *
from tkinter.ttk import *

window = Tk()
window.title("First Window")
selected = IntVar()
lbl = Label(window, text="Show Value")
rad1 = Radiobutton(window, text="First", value=1, variable=selected)
rad2 = Radiobutton(window, text="Second", value=2, variable=selected)
rad3 = Radiobutton(window, text="Third", value=3, variable=selected)
def clicked():
    lbl.configure(text=selected.get())
btn = Button(window, text="Click Me", command=clicked)
rad1.grid(column=0, row=0)
rad2.grid(column=1, row=0)
rad3.grid(column=2, row=0)
btn.grid(column=4, row=0)
lbl.grid(column=0, row=1)
window.mainloop() 

每次我們選中一個單選框,並點擊按鈕,標簽框中就會顯示其值:

 

添加文本區
添加文本區可以用ScrolledText類創建一個文本框:

from tkinter import scrolledtext
txt = scrolledtext.ScrolledText(window, width=40, height=10)

我們需要指定一個文本區的寬度和高度,否則它會占住整個窗口:

from tkinter import *
from tkinter import scrolledtext

window = Tk()
window.title("First Window")
window.geometry("350x200")
txt = scrolledtext.ScrolledText(window, width=40, height=10)
txt.grid(column=0, row=0)
window.mainloop()

 

 

 

 

用以下方法可以在文本區中插入文本:

txt.insert(INSERT, "Text goes here")

用以下方法可以將文本區中的文本刪除:

txt.delete(1.0, END)

創建消息框
我們可以按如下方式創建一個消息框:

from tkinter import messagebox
messagebox.showinfo("Message title", "Message content")

我們創建一個按鈕,當它被點擊時顯示一個消息框:

from tkinter import *
from tkinter import messagebox

window = Tk()
window.title("First Window")
window.geometry("350x200")
def clicked():
messagebox.showinfo("Message title", "Message content")
btn = Button(window, text="Click here", command=clicked)
btn.grid(column=0, row=0)
window.mainloop()

 

 

 添加Spinbox

Spinbox是輸入控件;與Entry類似,但是可以指定輸入范圍值。

spin = Spinbox(window, from_=0, to=100)

通過from_和to參數指定范圍,也可以用width參數指定控件寬度。

from tkinter import *

window = Tk()
window.title("First Window")
window.geometry("350x200")
spin = Spinbox(window, from_=0, to=100, width=5)
spin.grid(column=0, row=0)
window.mainloop()

 

 

 

也可以指定某些特定的值,而不是整個范圍:

from tkinter import *

window = Tk()
window.title("First Window")
window.geometry("350x200")
spin = Spinbox(window, values=(3,8,11), width=5)
spin.grid(column=0, row=0)
window.mainloop()

 

 這樣,Spinbox控件就只會顯示3個數字即3,8,11。

可以用如下方式給Spinbox控件設置默認值:

var = IntVar()
var.set(36)
spin = Spinbox(window, from_=0, to=100, width=5, textvariable=var)

運行代碼就可以看到36作為Spinbox控件的默認值顯示了。

添加進度條
我們可以用Progressbar類創建進度條:

from tkinter.ttk import Progressbar
bar = Progressbar(window, length=200)

設置一下進度條的值:

bar['value'] = 70

改變進度條的顏色可以按如下步驟進行:

from tkinter import *
from tkinter.ttk import Progressbar
from tkinter import ttk
window = Tk()
window.title("First Window")
window.geometry('350x200')
style = ttk.Style()
style.theme_use('default')
style.configure("black.Horizontal.TProgressbar", background='black')
bar = Progressbar(window, length=200, style='black.Horizontal.TProgressbar')
bar['value'] = 70
bar.grid(column=0, row=0)
window.mainloop()

 

 添加文件對話框

我們可以按如下方式創建一個文件對話框:

from tkinter import filedialog
file = filedialog.askopenfilename()

當你選擇一個文件並點擊打開,file變量將會保存該文件的路徑。

如果想一次選擇多個文件並打開,我們可以用:

files = filedialog.askopenfilenames()

用filetypes參數指定文件對話框的文件類型,只需在元組中指定擴展名即可。

file = filedialog.askopenfilename(filetypes = (("Text files","*.txt"),("all files","*.*")))

askdirectory函數可以讓我們請求目錄:

dir = filedialog.askdirectory()

可以用initialdir參數指定打開的初始目錄:

from tkinter import *
from tkinter import filedialog
import os

window = Tk()
window.title("First Window")
window.geometry('350x200')
def clicked():
file = filedialog.askopenfilenames(initialdir=os.path.dirname(__file__))
btn = Button(window, text="Click Me", command=clicked)
btn.grid(column=0, row=0)
window.mainloop()

 

 

 

 

轉自:https://zhuanlan.zhihu.com/p/75872830

 


免責聲明!

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



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