本文我們將學習如何使用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