用戶與程序的交互
- CLI(Command Line Interface,命令行接口)
- GUI( Graphical User Interface,圖形用戶接口)
CLI
Command Line Interface,命令行接口,以一行文字作為輸入,一般只能顯示文字,例如windows自帶的cmd
GUI
Graphical User Interface,圖形用戶接口,我們常用的window系統就有很多豐富的界面,包括窗口、按鈕、文本顯示,圖片顯示等等
python上的GUI庫 -- Tkinter
Tkinter 是 Python 的標准 GUI 庫。Python 使用 Tkinter 可以快速的創建 GUI 應用程序。IDLE、turtle界面也是用 Tkinter 編寫而成。
Tkinter窗體
Python自帶的可編輯的GUI界面,是一個圖像窗口。Tkinter是使用 python 進行窗口視窗設計的模塊。
示例:
# 導入tkinter庫
import tkinter
# 創建一個窗體
main = tkinter.Tk()
# 進入消息循環,讓窗口可以不斷刷新
main.mainloop()
設置窗體的屬性
import tkinter
main = tkinter.Tk()
# 設置標題
main.title("My First Window")
# 設置大小(寬x高)
main.geometry("300x200")
main.mainloop()
Tkinter顯示控件--Label
Label(標簽)控件,是最簡單的顯示控件,可以顯示一些文字
示例:
import tkinter
main = tkinter.Tk()
l = tkinter.Label(main,text='First Label')
l.pack()
main.mainloop()
其中'l.pack()'表示將創建的Label控件l放到main布局中
設置Label的背景顏色
可在創建Label控件時指定bg屬性為相應的背景顏色
示例:
import tkinter
main = tkinter.Tk()
l = tkinter.Label(main,text='First Label',bg='red')
l.pack()
main.mainloop()
也可以通過config方式進行配置
Label可以設置以下屬性
屬性 | 說明 |
---|---|
bg | 背景顏色 |
fg | 前景顏色,即文字的顏色 |
text | 顯示的文字 |
height | 控件的高度,Label中表示為一個字符高度的多少倍 |
width | 控件的寬度,Label中表示為一個字符寬度的多少倍 |
... | ... |
示例 |
import tkinter
main = tkinter.Tk()
l = tkinter.Label(main)
l.config(text='First Label')
l.config(bg='red')
l.pack()
main.mainloop()
Tkinter按鈕控件 -- Button
Button(按鈕)可以讓用戶點擊
示例
b = tkinter.Button(main)
b.config(text='First Button')
b.pack()
同理,也可以設置config改變背景顏色等屬性
b = tkinter.Button(main)
b.config(text='First Button')
b.config(bg='green')
b.pack()
按鈕的點擊事件處理
以上示例的按鈕點擊沒有任何反應,因為我們還沒有設置按鈕的command屬性,該屬性表示點擊按鈕后會調用的函數。
因此我們需要先定義一個函數,例如
def btn_click():
print('Button Click')
然后,設置按鈕的command屬性為上面定義的btn_click函數
b.config(command=btn_click)
運行程序,點擊按鈕,觀察IDLE輸出,可以觀察到,每次點擊按鈕,IDLE都會輸出一句Button Click
我們也可以通過按鈕的點擊事件改變其他控件的屬性,例如label控件的顯示文字,只需要在btn_click
def btn_click():
print('Button Click')
l.config(text='changed')
運行程序,點擊按鈕就會改變label的顯示文字了
完整代碼為:
import tkinter
def btn_click():
print('Button Click')
main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x200')
l = tkinter.Label(main, text='First label')
l.config(bg='red')
l.config(fg='white')
l.config(height=5)
l.config(width=20)
l.pack()
b = tkinter.Button(main,text='Click me')
b.config(bg='green')
b.config(command=btn_click)
b.pack()
main.mainloop()
Tkinter的輸入框控件 -- Entry
Python Tkinter 文本框用來讓用戶輸入一行文本字符串。
示例, 創建一個輸入框
e = tkinter.Entry(main)
e.pack()
獲取和設置輸入框的文字
有了輸入框,我們可以讓用戶輸入文字。但是上面的程序還沒有處理用戶輸入了什么。
我們通過按鈕的事件來進行配合,label的文字改為提示語:“Input some text:”,button的文字改為“OK”,並在button_click函數中處理輸入框entry里用戶輸入的文字
def btn_click():
print(e.get())
l.config(text=e.get())
這樣我們在輸入框entry輸入文字后,點擊OK按鈕,會發現標簽label的文字也會隨之改變
我們也可以一開始在創建輸入框entry的時候設置默認的文字
e = tkinter.Entry(main)
e.insert(0,'000')
e.pack()
這樣窗口創建時entry就會自動有默認的輸入文字
完整代碼如下:
import tkinter
def btn_click():
print(e.get())
l.config(text=e.get())
main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x200')
l = tkinter.Label(main, text='Input some text')
l.config(bg='red')
l.config(fg='white')
l.config(height=2)
l.config(width=20)
l.pack()
e = tkinter.Entry(main)
e.insert(0,'000')
e.pack()
b = tkinter.Button(main,text='OK')
b.config(bg='green')
b.config(command=btn_click)
b.pack()
main.mainloop()
tkinter的消息提醒控件 -- massagebox
消息框,用於顯示你應用程序的消息框,也就是我們平時看到的彈窗。
一個簡單的提示框示例:
import tkinter.messagebox # 要使用messagebox先要導入模塊
tkinter.messagebox.showinfo(title='tips', message='Hello!')
消息框messagebo一般在用戶進行了某些操作之后處理信息時使用。
因此,經常會在按鈕button的點擊事件函數里使用。
例如,我們可以接着上面的例子,在用戶點擊button后,獲取輸入框entry的文字進行相應的提示:
import tkinter.messagebox
def btn_click():
tkinter.messagebox.showinfo(title='tips', message=e.get())
提示信息的幾種形式
messagebox提示信息的幾種形式:
tkinter.messagebox.showinfo(title='tips', message='hello') # 提示信息對話窗
tkinter.messagebox.showwarning(title='tips', message='warning') # 提出警告對話窗
tkinter.messagebox.showerror(title='tips', message='error!') # 提出錯誤對話窗
print(tkinter.messagebox.askquestion(title='tips', message='need some help?')) # 詢問選擇對話窗return 'yes', 'no'
print(tkinter.messagebox.askyesno(title='tips', message='hello')) # return 'True', 'False'
print(tkinter.messagebox.askokcancel(title='tips', message='hello')) # return 'True', 'False'
對話框 | 示例 |
---|---|
showinfo提示信息對話框 | ![]() |
showwarning提示警告對話框 | ![]() |
showerror提示錯誤對話框 | ![]() |
askyesno選擇對話框 | ![]() |
我們可以根據判斷用戶的輸入來進行不同形式的提示,例如判斷輸入是不是為“123456”
示例
import tkinter.messagebox
def btn_click():
if e.get() == '123456':
tkinter.messagebox.showinfo(title='tips', message='bingo')
else:
tkinter.messagebox.showerror(title='tips', message='error')
完整代碼:
import tkinter
import tkinter.messagebox
def btn_click():
if e.get() == '123456':
tkinter.messagebox.showinfo(title='tips', message='bingo')
else:
tkinter.messagebox.showerror(title='tips', message='error')
main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x200')
l = tkinter.Label(main, text='Input some text')
l.config(bg='red')
l.config(fg='white')
l.config(height=2)
l.config(width=20)
l.pack()
e = tkinter.Entry(main)
e.insert(0,'000')
e.pack()
b = tkinter.Button(main,text='OK')
b.config(bg='green')
b.config(command=btn_click)
b.pack()
main.mainloop()
tkinter的列表框控件 -- Listbox
Listbox(列表框)組件用於顯示一個選擇列表。Listbox 只能包含文本項目,並且所有的項目都需要使用相同的字體和顏色。根據組件的配置,用戶可以從列表中選擇一個或多個選項。
創建和設置Listbox
創建一個Listbox,並放置到主窗口:
lbox = tkinter.Listbox(main)
lbox.pack()
此時創建的Listbox沒有任何內容,需要往里面插入內容
例如插入fruits:
fruits = ['apple', 'banana', 'orange']
for f in fruits:
lbox.insert('end', f)
完整代碼:
import tkinter
main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x300')
lbox = tkinter.Listbox(main)
lbox.pack()
fruits = ['apple', 'banana', 'orange']
for f in fruits:
lbox.insert('end', f)
main.mainloop()
獲取Listbox的選擇內容
curselection():
返回一個元組,包含被選中的選項的序號(從 0 開始)
如果沒有選中任何選項,返回一個空元組
get(first, last=None):
返回一個元組,包含參數 first 到 last 范圍內(包含 first 和 last)的所有選項的文本
如果忽略 last 參數,表示返回 first 參數指定的選項的文本
例如,添加一個按鈕獲取Listbox選擇的內容:
def btn_click():
sl = lbox.curselection()
for i in sl:
print(i)
tkinter.messagebox.showinfo(message=lbox.get(i))
b = tkinter.Button(main, text='ok')
b.config(command=btn_click)
b.pack()
完整代碼:
import tkinter
import tkinter.messagebox
def btn_click():
sl = lbox.curselection()
for i in sl:
print(i)
tkinter.messagebox.showinfo(message=lbox.get(i))
main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x300')
lbox = tkinter.Listbox(main)
lbox.pack()
fruits = ['apple', 'banana', 'orange']
for f in fruits:
lbox.insert('end', f)
b = tkinter.Button(main, text='ok')
b.config(command=btn_click)
b.pack()
main.mainloop()
刪除Listbox中的內容
delete(first, last=None):
刪除參數 first 到 last 范圍內(包含 first 和 last)的所有選項
如果忽略 last 參數,表示刪除 first 參數指定的選項
例如在btn_click中將選擇的內容用delete刪除:
def btn_click():
sl = lbox.curselection()
for i in sl:
print(i)
lbox.delete(i)
選擇其中一個內容(例如banana),然后點擊按鈕,就可以發現選擇的內容已被刪除
完整代碼:
import tkinter
import tkinter.messagebox
def btn_click():
sl = lbox.curselection()
for i in sl:
print(i)
lbox.delete(i)
main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x300')
lbox = tkinter.Listbox(main)
lbox.pack()
fruits = ['apple', 'banana', 'orange']
for f in fruits:
lbox.insert('end', f)
b = tkinter.Button(main, text='delete')
b.config(command=btn_click)
b.pack()
main.mainloop()
單選按鈕RadioButton
RadioButton一般用於提供一組選項,讓用戶從多個選項中選擇其中一個。
完整代碼:
import tkinter
def rbtn_selected():
print('You select', v.get())
main = tkinter.Tk()
main.geometry("300x300")
v = tkinter.IntVar()
r1 = tkinter.Radiobutton(main, text='One', variable=v, value=1)
r1.config(command=rbtn_selected)
r1.pack()
r2 = tkinter.Radiobutton(main, text='Two', variable=v, value=2)
r2.config(command=rbtn_selected)
r2.pack()
r3 = tkinter.Radiobutton(main, text='Three', variable=v, value=3)
r3.config(command=rbtn_selected)
r3.pack()
main.mainloop()
勾選按鈕CheckButton
CheckButton一般用於提供一組選項,讓用戶從其中選擇多個。
完整代碼
import tkinter
def cbtn_selected():
print('You select', v1.get(), v2.get())
main = tkinter.Tk()
main.geometry("300x300")
v1 = tkinter.IntVar()
v2 = tkinter.IntVar()
c1 = tkinter.Checkbutton(main, text='apple', variable=v1, onvalue=1, offvalue=0)
c1.config(command=cbtn_selected)
c1.pack()
c2 = tkinter.Checkbutton(main, text='banana', variable=v2, onvalue=1, offvalue=0)
c2.config(command=cbtn_selected)
c2.pack()
main.mainloop()
拖動條Scale
Scale一般用於提供一個范圍內的數字選擇,讓用戶可以拖動。
完整代碼
import tkinter
def btn_click():
print('horizontal', s1.get())
print('vertical', s2.get())
main = tkinter.Tk()
main.geometry("300x300")
s1 = tkinter.Scale(main, label='drag me', from_=1, to=100)
s1.config(orient=tkinter.HORIZONTAL)
s1.pack()
s2 = tkinter.Scale(main, label='drag me', from_=1, to=100)
s2.config(orient=tkinter.VERTICAL)
s2.pack()
b = tkinter.Button(main, text='OK')
b.config(command=btn_click)
b.pack()
main.mainloop()