1. 程式人生 > >python3:Tkinter——簡單的視窗視窗

python3:Tkinter——簡單的視窗視窗

程式設計環境:pycharm、python 3.6

Tkinter 是 tk 的 python 介面,使用 python 進行視窗視窗的設計。其操作非常的簡單易懂,對於和我一樣的初學者來說,是入門之選。

本博文包括Label、Button、Entry、Text、Listbox、Radiobutton、Scale、Checkbutton、Canvas、Manubar、Frame、Messagebox、pack grid place的使用。

視窗主題框架

一個Tkinter主體框架可以包含下面幾個部分:

  1. 定義 window 視窗並設定 window的一些屬性
  2. 編寫視窗內容
  3. 執行window.mainloop()
import tkinter as tk        #匯入tkinter模組

window = tk.Tk()            #主視窗
window.title('my window')   #視窗標題
window.geometry('200x100')  #視窗尺寸

### 這裡是視窗的內容###

window.mainloop()           #迴圈訊息,讓視窗活起來

視窗控制元件

下面對視窗內容可包括的一些控制元件操作進行簡單的介紹:

  • tk.Label 標籤
l = tk.Label(window, 
    text='OMG! this is TK!',    # 標籤的文字
    bg='green',                 # 背景顏色
    font=('Arial', 12),         # 字型和字型大小
    width=15, height=2          # 標籤長寬
    )
l.pack()    # 固定視窗位置

如果我們需要通過變數的形式控制Label的顯示,那麼需要用到var變數,如下:

var = tk.StringVar()    # 文字變數儲存器
var.set('OMG! This is TK!')
l = tk.Label(window, 
    textvariable=var,   # 使用 textvariable 替換 text, 因為這個是可以變化的
    bg='green', font=('Arial', 12), width=15, height=2)
l.pack() 

上述的var變數值可以通過編寫條件控制語句等進行更改,實現某種功能。

  • tk.Button 按鈕
b = tk.Button(window, 
    text='hit me',      # 顯示按鈕上的文字
    width=15, height=2, 
    command=hit_me)     # 點選按鈕執行的命令
b.pack()                # 按鈕位置

點選按鈕觸發事件的函式hit_me,可自行定義相應的功能,由於python執行的順序是從上往下,所以函式必須要放在按鈕的上面。參考如下:

on_hit = False  # 預設初始狀態為 False
def hit_me():
    global on_hit            # on_hit為全域性變數
    if on_hit == False:      # 從 False 狀態變成 True 狀態
        on_hit = True
        var.set('you hit me')   # 設定標籤的文字為 'you hit me'
        l.config(bg='blue')     #更改label的背景顏色,也可以更改其他選項
    else:                    # 從 True 狀態變成 False 狀態
        on_hit = False
        var.set('')          # 設定 文字為空
        l.config(bg='red')
  • tk.Entry 輸入

建立輸入框entry,使用者輸入任何內容都顯示為*

e = tk.Entry(window, show='*') #輸入框,輸入時顯示*
e.pack()
  • tk.Text 文字框

建立文字框,使用者可輸入內容

t = tk.Text(window,height=2)  #建立文字框,使用者可輸入內容
t.pack()

如果要實現entry輸入的內容顯示在text裡面,參考如下:

    var = e.get()              #從entry獲得變數值
    t.insert('insert', var)    #表示在游標選定的位置輸入
    t.insert('end',var)        #表示在最後輸入
    t.insert(2.2, var)         #表示在第二行的第二列輸入
  • tk.Listbox 列表
var2 = tk.StringVar()
var2.set((11,22,33,44)) #為變數設定值

#建立Listbox
lb = tk.Listbox(window, listvariable=var2)  #將var2的值賦給Listbox

#建立一個list並將值迴圈新增到Listbox控制元件中
list_items = [1,2,3,4]
for item in list_items:
    lb.insert('end', item)  #從最後一個位置開始加入值

lb.insert(1, 'first')       #插入操作,在第一個位置加入'first'字元
lb.insert(2, 'second')      #在第二個位置加入'second'字元
lb.delete(2)                #刪除操作,刪除第二個位置的字元
lb.pack()

  • tk.Radiobutton 選擇按鈕
var = tk.StringVar()
l = tk.Label(window, bg='yellow', width=20, text='empty')
l.pack()

def print_selection():
    l.config(text='you have selected ' + var.get())  #var.get()即獲取到變數 var 的值

r1 = tk.Radiobutton(window, text='Option A', variable=var, value='A', command=print_selection)
r1.pack()
r2 = tk.Radiobutton(window, text='Option B', variable=var, value='B', command=print_selection)
r2.pack()
r3 = tk.Radiobutton(window, text='Option C', variable=var, value='C', command=print_selection)
r3.pack()

其中variable=var,value='A'的意思就是,當我們滑鼠選中了其中一個選項,把value的值A放到變數var中,然後賦值給variable

  • tk.Scale 尺度
s = tk.Scale(window, label='try me', from_=5, to=11, orient=tk.HORIZONTAL,
             length=200, showvalue=0, tickinterval=2, resolution=0.01, command=print_selection)
s.pack()

這裡的引數label是指scale部件的名稱,即在這裡scale部件名稱為try me

引數from_=5,to=11的意思就是從5到11,即這個滾動條最小值為5,最大值為11(這裡使用from_是因為在python中有from這個關鍵詞)

引數orient=tk.HORIZONTAL在這裡就是設定滾動條的方向,如我們所看到的效果圖,這裡HORIZONTAL就是橫向。

引數length這裡是指滾動條部件的長度,但注意的是和其他部件width表示不同,width表示的是以字元為單位,比如width=4,就是4個字元的長度,而此處的length=200,是指我們常用的畫素為單位,即長度為200個畫素

引數resolution=0.01這裡我們可以藉助數學題來理解,我們做的很多數學題都會讓我們來保留幾位小數,此處的0.01就是保留2位小數,即效果圖中的5.00 9.00等等後面的兩位小數,如果保留一位就是resolution=0.1

這裡的showvalue就是設定在滾動條上方的顯示。showvalue=0顯示的就是效果圖,上方無結果顯示:

如果改為showvalue=1,則會顯示為:

  • tk.Checkbutton 勾選項
l = tk.Label(window, bg='yellow', width=20, text='empty')
l.pack()

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!')

var1 = tk.IntVar()
var2 = tk.IntVar()
c1 = tk.Checkbutton(window, text='Python', variable=var1, onvalue=1, offvalue=0, command=print_selection)
c2 = tk.Checkbutton(window, text='C++', variable=var2, onvalue=1, offvalue=0, command=print_selection)
c1.pack()
c2.pack()

引數onvalue和前面講的部件radiobutton中的value相似,當我們選中了這個checkbutton,onvalue的值1就會放入到var1中, 然後var1將其賦值給引數variableoffvalue用法相似,但是offvalue是在沒有選中這個checkbutton。

  • tk.Canvas 畫布
canvas = tk.Canvas(window, bg='blue', height=100, width=200)

image_file = tk.PhotoImage(file='ins.gif')
image = canvas.create_image(10, 10, anchor='nw', image=image_file)

x0, y0, x1, y1 = 50, 50, 80, 80
#兩點確定一條直線。此處給的就是從座標(50,50)到(80,80)畫一條直線。
line = canvas.create_line(x0, y0, x1, y1)   

#畫一個圓,填充色為red
oval = canvas.create_oval(x0, y0, x1, y1, fill='red')

#從0度到180度畫一個扇形
arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=180)

#建立一個矩形
rect = canvas.create_rectangle(100, 30, 100+20, 30+20)

canvas.pack()

image_file=tk.PhotoImage(file='ins.gif')這一句是創造一個變數存放ins.gif這張圖片。

image= canvas.create_image(10, 10, anchor='nw', image=image_file)裡面的引數10,10就是圖片放入畫布的座標, 而這裡的anchor=nw則是把圖片的左上角作為錨定點,在加上剛剛給的座標位置,即可將圖片位置確定。 最後一個引數的意思大家應該都知道,就是將剛剛存入的圖片變數,賦值給image

  • tk.Manubar選單欄
#建立一個選單欄,可以理解成一個容器,在視窗的上方
menubar = tk.Menu(window)
#定義一個空選單單元
filemenu = tk.Menu(menubar, tearoff=0)
#將上面定義的空選單命名為`File`,放在選單欄中,就是裝入那個容器中
menubar.add_cascade(label='File', menu=filemenu)

#在File中加入New的小選單,即我們平時看到的下拉選單,每一個小選單對應命令操作。
#如果點選這些單元, 就會觸發`do_job`的功能
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)

editmenu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='Edit', menu=editmenu)
editmenu.add_command(label='Cut', command=do_job)
editmenu.add_command(label='Copy', command=do_job)
editmenu.add_command(label='Paste', command=do_job)

submenu = tk.Menu(filemenu)
filemenu.add_cascade(label='Import', menu=submenu, underline=0)
#這裡和上面也一樣,在`Import`中加入一個小選單命令`Submenu1`
submenu.add_command(label="Submenu1", command=do_job)

window.config(menu=menubar)

效果如下:

  • tk.Frame 框架
frm = tk.Frame(window)  #在`window`上建立一個frame
frm.pack()

#在剛剛建立的`frame`上建立兩個`frame`,我們可以把它理解成一個大容器裡套了一個小容器,即`frm`上有兩個`frame` ,`frm_l`和`frm_r`
frm_l = tk.Frame(frm)
frm_r = tk.Frame(frm)

#這裡是控制小的`frm`部件在大的`frm`的相對位置,此處`frm_l`就是在`frm`的左邊,`frm_r`在`frm`的右邊
frm_l.pack(side='left')
frm_r.pack(side='right')

#這裡的三個label就是在我們建立的frame上定義的label部件,還是以容器理解,就是容器上貼了標籤,來指明這個是什麼,解釋這個容器。
tk.Label(frm_l, text='on the frm_l1').pack()
tk.Label(frm_l, text='on the frm_l2').pack()
tk.Label(frm_r, text='on the frm_r1').pack()
  • tk.Messagebox 彈窗

給出幾種常見形式的彈窗提示:

tk.messagebox.showinfo(title='',message='')    #提示資訊對話窗
tk.messagebox.showwarning()                    #提出警告對話窗
tk.messagebox.showerror()                      #提出錯誤對話窗
tk.messagebox.askquestion()                    #詢問選擇對話窗

print(tk.messagebox.askquestion())             #返回yes和no
print(tk.messagebox.askokcancel())             #返回true和false
print(tk.messagebox.askyesno())                #返回true和false
print(tk.messagebox.askretrycancel())          #返回true和false
  • tk.pack  tk.grid  tk.place 放置位置

tk.pack:按照上下左右的方式排列。

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

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

for i in range(4):
    for j in range(3):
        tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10)

以上的程式碼就是建立一個四行三列的表格,其實grid就是用表格的形式定位的。這裡的引數 row為行,colum為列,padx就是單元格左右間距,pady就是單元格上下間距。

tk.place:給精確的座標來定位,如此處給的(20,10),就是將這個部件放在座標為(x,y)的這個位置 後面的引數anchor=nw就是前面所講的錨定點是西北角。

tk.Label(window, text=1).place(x=20, y=10, anchor='nw')

以上就是關於tkinter學習內容的整理。我們可以感受到它的簡潔明瞭,易於初學者上手。之後也會編寫一些有趣的視窗進一步的瞭解tkinter的精髓。