Python教程 - Tkinter


用戶與程序的交互

  • CLI(Command Line Interface,命令行接口)
  • GUI( Graphical User Interface,圖形用戶接口)

CLI

Command Line Interface,命令行接口,以一行文字作為輸入,一般只能顯示文字,例如windows自帶的cmd

cmd

GUI

Graphical User Interface,圖形用戶接口,我們常用的window系統就有很多豐富的界面,包括窗口、按鈕、文本顯示,圖片顯示等等

gui

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)

image
完整代碼:

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()

image
完整代碼:

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),然后點擊按鈕,就可以發現選擇的內容已被刪除
image
image
完整代碼:

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()


免責聲明!

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



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