tkinter gui控件回調和grid佈局優化

0、引子

Tkinter 是 Python 的標準 GUI 庫。Python 使用 Tkinter 可以快速的創建 GUI 應用程序。由於 Tkinter 是內置到 python 的安裝包中、只要安裝好 Python 之後就能 import Tkinter 庫,非常方便。

1、控件回調

1.1按鈕回調

複製代碼

import tkinter as tkdef printInfo():    print("printInfo button click")

myWindow = tk.Tk()
myWindow.geometry('300x200')
myWindow.title('Python GUI Learning')
myWindow.resizable(width=False, height=False)#Quit按鈕退出;Run按鈕打印計算結果tk.Button(myWindow, text='Quit', command=myWindow.quit).grid(row=2, column=0,  padx=5, pady=5)
tk.Button(myWindow, text='Run', command=printInfo).grid(row=2, column=1,  padx=5, pady=5)
myWindow.mainloop()

複製代碼

 按下Run打印信息,按下Quit退出。

C:\Users\pwplu\AppData\Local\Programs\Python\Python37\python.exe E:/test1/test_opencv/test3.py
printInfo button click
printInfo button click

1.2單選框回調

複製代碼

r = tk.IntVar()def radCall():    print(f"radio:{r.get()}")

radio1=tk.Radiobutton(myWindow, text="one",value=1,variable=r,command=radCall).grid()
radio2=tk.Radiobutton(myWindow, text="two",value=2,variable=r,command=radCall).grid()

複製代碼

 選擇單選框後,觸發回調輸出:

複製代碼

C:\Users\pwplu\AppData\Local\Programs\Python\Python37\python.exe E:/test1/test_opencv/test3.py
radio:1radio:1radio:1radio:2radio:2

複製代碼

如果希望重複點擊同個單選框時不打印相同的內容,即只有值變化時候才觸發回調則需要修改回調函數,記錄當前的值即可:

複製代碼

prv = tk.IntVar()
r = tk.IntVar()
prv = -1def radCall():    global prv
    radSel = r.get()    if radSel == 1 and prv != radSel:        print(r.get())    elif radSel == 2 and prv != radSel:        print(r.get())
    prv = radSel

複製代碼

1.3滑動條回調與只在釋放時候觸發一次

複製代碼

def scaleFunc(v):    print(f"radio:{v}")

scale1 = tk.Scale( myWindow, from_=1, to=100, length=100, orient=tk.HORIZONTAL, command = scaleFunc)
scale1.pack()
scale1.set(15)
scale2 = tk.Scale( myWindow, from_=1, to=100, length=150, orient=tk.VERTICAL, command = scaleFunc)
scale2.pack()
scale2.set(10)

複製代碼

當滑動條滑動時,會一直觸發回調函數,並且scaleFunc無法區分是哪一個滑動條動作觸發的動作。

一般地,希望不要反覆觸發回調函數,而是釋放時觸發一次即可,並不需要中間的過程,以減少資源消耗。那麼可以捕捉鼠標的操作,滑動條command參數無法完成這個功能,可以爲滑動條綁定鼠標事件,鼠標鬆開時觸發一次。

複製代碼

def scaleFunc(event):    print(f"radio:{event}, value={var1.get()}")

var1 = tk.IntVar()
scale1 = tk.Scale( myWindow, variable = var1, from_=1, to=100, length=100, orient=tk.HORIZONTAL)
scale1.pack()
scale1.set(15)
scale1.bind("<ButtonRelease-1>", scaleFunc)

複製代碼

輸出如下,調爲1,改到85,再調到51,只觸發了3次。

radio:<ButtonRelease event state=Mod1|Button1 num=1 x=5 y=31>, value=1radio:<ButtonRelease event state=Mod1|Button1 num=1 x=74 y=30>, value=85radio:<ButtonRelease event state=Mod1|Button1 num=1 x=47 y=33>, value=51

2、grid佈局

在一個小工具項目中,出現了界面佈局的問題,grid按照行列對齊方式佈局。

因爲不同的元素尺寸不同,導致下面的單色選項的R-G-B二級選項,單選框無法對齊。第6行RGB分別對齊1,2,3列,但是低二列和第三列跑到最右側,第一列需要對齊圖像中心,那麼第二列就會出現的圖像空間的右側,無法挨着紅色單選框連續排列。

複製代碼

radio5r=tk.Radiobutton(myWindow, text="紅色",  value=51, variable=r, command=radCall5r)
radio5g=tk.Radiobutton(myWindow, text="綠色",  value=52, variable=r, command=radCall5g)
radio5b=tk.Radiobutton(myWindow, text="藍色",  value=53, variable=r, command=radCall5b)
radio5r.grid(row=6, column=1, sticky=tk.W, ipadx = 15)
radio5g.grid(row=6, column=2, sticky=tk.W, ipadx = 15)
radio5b.grid(row=6, column=3, sticky=tk.W, ipadx = 15)

複製代碼

這個問題怎麼解決?可以添加一個frame空間,把R-G-B二級單選框當做一個整體處理,frame排列在第一列即可。

複製代碼

group = tk.LabelFrame(myWindow, text="R-G-B")
group.grid(row=6, column=1, sticky=tk.W, ipadx = 5)

radio5r=tk.Radiobutton(group, text="紅色",  value=51, variable=r, command=radCall5r)
radio5g=tk.Radiobutton(group, text="綠色",  value=52, variable=r, command=radCall5g)
radio5b=tk.Radiobutton(group, text="藍色",  value=53, variable=r, command=radCall5b)

複製代碼

  另外若去除R-G-B二級組合的Frame的外框,則就實現了三個單選框按順序緊湊排列的效果。

group = tk.LabelFrame(myWindow, borderwidth =0) #邊框爲0就看不到邊框了group.grid(row=6, column=1, sticky=tk.W, ipadx = 5)

 3、附錄

1)Tkinter組件

 2)Grid結構管理器的參數

  鄭州婦科醫院哪裏好:http://www.zztjfkyy.com/鄭州婦科醫院哪家好:http://www.zztjfkyy.com/鄭州婦科醫院排名:http://www.zztjfkyy.com/

4、參考文檔


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章