第9章 多選按鈕控件(Checkbutton)
多選按鈕控件,也叫檢查按鈕控件,是用於實現ON-OFF選擇的標准控件。多選按鈕的提示信息可以是文字,也可以是圖像。每個多選按鈕都可以設置獨立的回調函數,以實現特定的處理。也可以多個多選按鈕共同使用一個回調函數。
提示文本只能使用一種字體,但可以跨行顯示。與單選按鈕不一樣的是,每個多選按鈕需要與一個變量相關聯。 多選按鈕控件用於在兩個不同的值之間進行選擇(通常是打開或關閉功能)。
9.1 多選按鈕控件的屬性
9.1.1 activebackground 和activeforeground
activebackground是鼠標左鍵按下時,多選按鈕的背景顏色,鼠標鍵釋放後,恢復初始顏色。activeforeground是鼠標左鍵按下時,多選按鈕的文本顏色,鼠標鍵釋放後,恢復初始顏色
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,
text='選擇1',
activebackground='red',
activeforeground='yellow')
b1.pack()
root.mainloop()
結果:
9.1.2 anchor
用法和第八章的單選按鈕是一樣的。具體可以參考8.1.2節的說明。這裡只附上代碼和結果。
#pack 布局
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,
text='選擇1',anchor=tk.S+tk.W)
b1.pack(fill=tk.BOTH,expand=True)
root.mainloop()
#grid布局:
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
b1 = tk.Checkbutton(root,
text='選擇1',anchor=tk.S+tk.W)
b1.grid(row=0,column=0,sticky='nsew')
root.mainloop()
結果:
9.1.3 background(bg)
設置多選按鈕的背景顏色。bg是縮寫格式。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,text='紅色',bg='red')
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue')
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green')
b3.pack()
root.mainloop()
結果:
9.1.4 foreground(fg)
設置多選按鈕的提示文字顏色。fg是縮寫格式。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,
text='紅色',bg='red',fg='yellow')
b1.pack()
b2 = tk.Checkbutton(root,
text='藍色',bg='blue',fg='yellow')
b2.pack()
b3 = tk.Checkbutton(root,
text='綠色',bg='green',fg='yellow')
b3.pack()
root.mainloop()
結果:
9.1.5 font
設置多選按鈕提示文本的字體。一個多選按鈕只能設置一種字體。詳細的字體說明見3.3.3節。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,
text='紅色',fg='red',
font=('times',20,'bold'))
b1.pack()
root.mainloop()
結果:
9.1.6 image和bitmap
image和bitmap是兩種顯示圖片提示信息的方法。image是主要使用的。bitmap方法基本上已經很少用到。提示信息的優先級:image>bitmap>text
#image
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
aimage=tk.PhotoImage(file='a.gif')
b1 = tk.Checkbutton(root,image=aimage,bg='red')
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue')
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green')
b3.pack()
root.mainloop()
#bitmap
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,bitmap='error',bg='red')
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue')
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green')
b3.pack()
root.mainloop()
結果:
9.1.7 borderwidth(bd)
設置多選按的邊框寬度,默認單位是像素。其他的取值參見3.3.1節
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,text='邊框',bd=20)
b1.pack()
root.mainloop()
結果:
說明:圖一使用的默認值,圖二使用的是20個像素的邊框。可以看到有明顯的區別。
9.1.8 state 和disabledforeground
state是設置多選按鈕的狀態。一共有三種:NORMAL、ACTIVE和DISABLED。NORMAL和ACTIVE狀態下,多選按鈕可以正常使用。DISABLED狀態下,多選按鈕不能使用或者選擇。而disabledforeground是設置在DISABLED狀態下多選按鈕的提示文字顏色的,也就是說,在多選按鈕被禁止使用的情況下,可以通過這個屬性來提示用戶當前的狀態是DISABLED。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,
text='禁用背景色',
state='disabled',
disabledforeground='red')
b1.pack()
root.mainloop()
結果:
說明:在多選按鈕被禁用的情況下,提示文本的顏色是紅色的。
9.1.9 highlightcolor、highlightbackground和highlightthickness
這三個屬性是處理多選按鈕獲得或者失去輸入焦點時候的邊框的背景顏色、高亮顏色以及邊框的寬度。不過highlightcolor和highlightbackground在多選按鈕中不起作用。highlightthickness是有效果的,可以增加邊框的寬度。
9.1.10 selectcolor
多選按鈕的指示符背景色。默認是白色的。可以通過設置此選項設置指示符的顏色
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
b1 = tk.Checkbutton(root,text='紅色',
bg='red',selectcolor='yellow')
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue')
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green')
b3.pack()
root.mainloop()
結果:
9.1.11 selectimage
設置多選按鈕被選中後,要顯示的圖片。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
aimage=tk.PhotoImage(file='a.gif')
bimage=tk.PhotoImage(file='b.gif')
b1 = tk.Checkbutton(root,bg='red',
image=aimage,selectimage=bimage)
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue')
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green')
b3.pack()
root.mainloop()
結果:
說明:一定要使用image來作為提示信息。如果是使用text屬性來顯示文本提示信息的,selectimage屬性沒有作用。
9.1.12 cursor
鼠標經過多選按鈕時的形狀。詳細的cursor信息參見3.3.6節
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,bg='red',text='紅色',cursor='spider')
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue')
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green')
b3.pack()
root.mainloop()
結果:
9.1.13 overrelief 和 relief
relief是設置邊框的顯示效果。overrelief是在鼠標經過時邊框的顯示效果。relief的有關說明見3.3.5節
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,bg='red',
text='紅色',relief='flat',bd=5)
b1.pack()
b2 = tk.Checkbutton(root,
text='藍色',bg='blue',relief='flat',
overrelief='groove',bd=5)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',
relief='flat',bd=5)
b3.pack()
root.mainloop()
結果:
說明:
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,text='紅色',
bg='red',bd=5,indicatoron=False,
offrelief='groove',relief='flat')
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue',
bd=5,indicatoron=False,
offrelief='groove',relief='flat')
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',
bd=5,indicatoron=False,
offrelief='groove',relief='flat')
b3.pack()
root.mainloop()
結果:
說明:1. indicatoron=False時,多選按鈕沒有通常的指示符。
offrelief的設置起作用,而relief則沒有效果了。offrelief=’groove’而relief=’flat’,可以看到最終的效果是GROOVE。
9.1.15 padx和pady
padx和pady是分別定義留出多大的內邊距在水平和垂直方向上。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,text='紅色',
bg='red',bd=5,padx=10,pady=10)
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue',bd=5)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',bd=5)
b3.pack()
root.mainloop()
結果:
9.1.16 compound
compound設置如何在使用圖片作為提示信息的時候疊加文字的方式。有5個選項:
LEFT,RIGHT,TOP,BOTTOM,CENTER
如果沒有設置compound是無法同時顯示文字和圖片的。顯示的優先級是image > bitmap >text
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
aimage=tk.PhotoImage(file='a.gif')
b1 = tk.Checkbutton(root,image=aimage,
compound=tk.TOP,bg='red',text='紅色')
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue',bd=5)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',bd=5)
b3.pack()
root.mainloop()
結果:
9.1.17 height 和width
設置多選選按鈕的長度和寬度。width的單位是字符,height的單位是行。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,height=2,width=3,bg='red',text='紅色')
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue',bd=5,)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',bd=5)
b3.pack()
root.mainloop()
結果:
9.1.18 takefocus
takefocus的作用是定義多選按鈕是否可以使用Tab鍵獲得輸入焦點。默認情況下是可以。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,takefocus=0,bg='red',text='紅色',bd=5)
b1.pack()
b2 = tk.Checkbutton(root,takefocus=1,text='藍色',bg='blue',bd=5,)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',bd=5)
b3.pack()
root.mainloop()
‘紅色’的多選按鈕是無法用Tab獲得輸入焦點的
‘藍色’的多選按鈕可以獲得輸入焦點,因為takefocus=1
‘綠色’的多選按鈕也可以獲得輸入焦點,因為默認值是1。
9.1.19 text和textvariable
有兩種方法設置多選按鈕的提示文字。一種是使用text,另外一種是使用textvariable。這個屬性不是多選按鈕的取值,僅僅設置多選按鈕的提示文字。
text屬性是直接賦值就可以了。textvariable需要通過修改與textvariable關聯的StringVar對象達到賦值提示文字的作用。
如何動態修改提示文字?也是有兩種方法:
(1)checkbutton[‘text’]=’提示文字’
(2)strvar.set(‘提示文字’)。strvar是一個StringVar對象,與textvariable相關聯。
#代碼1:
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
strvar=tk.StringVar()
strvar.set('藍色')
b1 = tk.Checkbutton(root,bg='red',text='紅色',bd=5)
b1.pack()
b2 = tk.Checkbutton(root,textvariable=strvar,
bg='blue',bd=5,)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',bd=5)
b3.pack()
root.mainloop()
#代碼2:
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
strvar=tk.StringVar()
strvar.set('藍色')
b1 = tk.Checkbutton(root,takefocus=0,
bg='red',text='紅色',bd=5)
b1.pack()
b2 = tk.Checkbutton(root,textvariable=strvar,
bg='blue',bd=5,)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',bd=5)
b3.pack()
def change_text():
b1['text']='提示文字'
strvar.set('提示文字')
b4=tk.Button(root,text='修改提示文字',
command=change_text)
b4.pack()
root.mainloop()
結果:
9.1.20 underline
underline的作用是在第幾個提示文字下面標識下劃線。0表示第一個字符,1,表示第二個字符,以此類推。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,bg='red',
underline=3,text='紅色的字符',bd=5)
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue',bd=5,)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',bd=5)
b3.pack()
root.mainloop()
結果:
9.1.21 wraplength
當提示文字過長的時候,是否折行顯示。在沒有規定width和height的情況下,控件會自動計算提示文字的大小並顯示。但是在規定了width的情況下,如果提示文字過長,會有部分文字無法顯示。這個時候,可以通過設置wraplength來折行顯示。但是如果height的行數設置不夠,還是會發生字符不能顯示的情況。注意wraplength的單位是像素,而不是字符。
#代碼1:
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,bg='red',height=5,width=3,
text='紅色的文字很長的文字',bd=5)
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue',bd=5,)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',bd=5)
b3.pack()
root.mainloop()
#代碼2:
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,bg='red',height=5,width=3,
wraplength=90,
text='紅色的文字很長的文字',bd=5)
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue',bd=5,)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',bd=5)
b3.pack()
root.mainloop()
#代碼3:
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Checkbutton(root,bg='red',height=5,width=3,
wraplength=40,
text='紅色的文字很長的文字',bd=5)
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue',bd=5,)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',bd=5)
b3.pack()
root.mainloop()
結果:
說明:
代碼1的情況就是多選按鈕的width不夠寬,因而無法顯示全部的提示文字。
代碼2的情況是設置了wraplength後,顯示折行。但是由於width不夠寬,還是不能顯示全部的內容。
代碼3的情況是顯示了全部的文字。
9.1.22 justify
justify是在折行的情況下定義如何對齊,有三種方式:CENTER,LEFT和RIGHT。詳細的說明見第四章
9.1.23 variable,onvalue和offvalue
多選按鈕可以設置on和off的數值,也就是多選按鈕是否被選中可以有不同的值。比如,選中為1,沒有選中為0等等。由於是多選按鈕,所以每一個多選按鈕都有一個變量,該變量與多選按鈕的variable相關聯。可以通過關聯的變量獲取多選按鈕當前的值,on或者off的值。比如下面代碼中的check_red等。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
entry=tk.StringVar()
check_red=tk.StringVar()
check_red.set('紅色On')
check_blue=tk.StringVar()
check_blue.set('藍色Off')
check_green=tk.StringVar()
check_green.set('綠色Off')
b1 = tk.Checkbutton(root,bg='red',text='紅色',bd=5,
onvalue='紅色On',offvalue='紅色Off',
variable=check_red)
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue',bd=5,
onvalue='藍色On',offvalue='藍色Off',
variable=check_blue)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',bd=5,
onvalue='綠色On',offvalue='綠色Off',
variable=check_green)
b3.pack()
b5=tk.Entry(root,textvariable=entry)
b5.pack()
def check_value():
entry.set(check_red.get()+' '+check_blue.get()
+" "+check_green.get())
b4=tk.Button(root,text='Check',command=check_value)
b4.pack()
root.mainloop()
結果:
說明:
variable與變量相關聯,可以直接使用get()方法獲取多選按鈕的取值,on或者off的值。
onvalue:當多選按鈕被選中時的取值
offvalue:當多選按鈕沒有被選中時的取值。
9.1.24 command
定義多選按鈕的回調函數,當多選按鈕的狀態發生變化時,就會調用這個回調函數。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
entry=tk.StringVar()
check_red=tk.StringVar()
check_red.set('紅色On')
check_blue=tk.StringVar()
check_blue.set('藍色Off')
check_green=tk.StringVar()
check_green.set('綠色Off')
b5=tk.Entry(root,textvariable=entry)
def red():
entry.set('紅色: '+check_red.get())
def blue():
entry.set('藍色: '+check_blue.get())
def green():
entry.set('綠色: '+check_green.get())
b1 = tk.Checkbutton(root,bg='red',text='紅色',bd=5,
onvalue='紅色On',offvalue='紅色Off',
variable=check_red,command=red)
b1.pack()
b2 = tk.Checkbutton(root,text='藍色',bg='blue',bd=5,
onvalue='藍色On',offvalue='藍色Off',
variable=check_blue,command=blue)
b2.pack()
b3 = tk.Checkbutton(root,text='綠色',bg='green',bd=5,
onvalue='綠色On',offvalue='綠色Off',
variable=check_green,command=green)
b3.pack()
b5.pack()
root.mainloop()
結果: