文章目錄
Scale 的數值輸入控制
Scale 的基本概念
Scale 可以翻譯爲尺度。Python的tkinter模塊中有 Widget控件Scale,這是一種圖形接口輸入功能,我們可以移動尺度條
產生某一範圍的數字
建立尺度條的方法是Scale(),它的構造方法如下:
Scale(父對象, options, ...)
參數:
- 第一個參數:
父對象
,表示這個尺度條將建立在哪一個窗口內 - 第二個參數:
options
,參數如下
參數 | 含義 |
---|---|
activebackground | 鼠標光標在尺度條上時的背景顏色 |
borderwidth | 3D邊界寬度 默認是兩個像素 |
bd | 3D邊界寬度 默認是兩個像素 |
bg | 背景顏色 |
command | 當使用者更改數值時,會自動執行此方法 |
cursor | 當鼠標光標在尺度條上時的形狀 |
fg | 文字前景色彩 |
font | 字形 |
from_ | 尺度條範圍值的初值 |
highlightbackground | 當尺度條獲取焦點時的背景顏色 |
highlightcolor | 當尺度條取得焦點時的顏色 |
label | 如果尺度條是水平的,則此標籤出現在左上角,如果尺度條是垂直的,則此標籤出現在右上角 默認是沒有標籤文字 |
length | 默認是100像素 |
orient | 可以設置水平HORIZONTAL或者垂直VERTICAL 默認是水平 |
relief | 可由此更改邊界外觀 默認是FLAT |
repeatdelay | 可設置需要按住尺度條多久後纔可移動此尺度條 單位是ms 默認是300 |
resolution | 每次更改的數值(相當於每次可以移動的步長) 例如, from_ =2.0, to=4.0,如果將resolution設爲0.5,則尺度可能數值是2.0、2.5、3.0、3.5、4.0 |
showvalue | 正常會顯示尺度條的目前值,如果設爲0則不顯示 |
state | 若設置爲DISABLED,則暫時無法使用此Scale |
takefocus | 正常時此尺度條可以循環取得焦點,如果設爲0則無法取得焦點 |
tickinterval | 尺度條的標記刻度 例如,from_=2.0,to=3.0, tickinterval=0.25,則刻度是2.0、2.25、2.50、2.75和3.0 |
to | 尺度條範圍值的末端值 |
throughcolor | 槽(trough) 的顏色 |
variable | 設置或取得目前選取的尺度值,它的值類型通常是IntVar或StringVar |
width | 對於垂直尺度條這是槽的寬度,對於水平尺度條這是槽的高度 |
Scale 的基本運用
例子
:
import tkinter
root = tkinter.Tk()
scale1 = tkinter.Scale(root, from_=0, to=10).pack()
# length 水平尺度條的寬度
scale2 = tkinter.Scale(root, from_=0, to=10, length=300, orient=tkinter.HORIZONTAL).pack()
root.mainloop()
運行結果:
例子
:
import tkinter
root = tkinter.Tk()
scale1 = tkinter.Scale(root,
from_=0, # 起點值
to=10, # 終點值
troughcolor="lightyellow", # 槽的顏色
width="30", # 槽的高度
tickinterval=2, # 刻度
label="刻度尺", # 標籤
length=300, # 長度
orient=tkinter.HORIZONTAL) # 水平
scale1.pack()
root.mainloop()
運行結果:
取得與設置Scale 的尺度值
使用get()方法取得尺度值,使用set()方法設置尺度值
例子
:
import tkinter
def show():
print("垂直尺度值 = {}\n水平尺度值 = {}".format(scale1.get(), scale2.get()))
root = tkinter.Tk()
scale1 = tkinter.Scale(root,
from_=0, # 起點值
to=10, # 終點值
troughcolor="lightyellow", # 槽的顏色
width="20", # 槽的高度
tickinterval=2, # 刻度
label="刻度尺", # 標籤
length=200) # 長度
scale1.pack()
scale2 = tkinter.Scale(root,
from_=0, # 起點值
to=10, # 終點值
troughcolor="lightyellow", # 槽的顏色
width="20", # 槽的高度
tickinterval=2, # 刻度
label="刻度尺", # 標籤
length=200, # 長度
orient=tkinter.HORIZONTAL) # 水平
scale2.pack()
button = tkinter.Button(root, text="cheak this", command=show)
button.pack()
root.mainloop()
運行結果:
使用 Scale 設置窗口背景顏色
Scale 控件有一個特點就是在移動時可以自動觸發時間
def show():
pass
scale = Scale(..., command=show)
例子
:
import tkinter
def show(source):
# source 用於接收Scale 傳回來的參數
red = rSlider.get()
green = gSlider.get()
blue = bSlider.get()
myColor = "#%02x%02x%02x" % (red, green, blue) # %02x 轉成16進制,字母小寫空缺補零
root.config(bg=myColor)
root = tkinter.Tk()
root.geometry("300x200")
rSlider = tkinter.Scale(root, from_=0, to=255, command=show)
gSlider = tkinter.Scale(root, from_=0, to=255, command=show)
bSlider = tkinter.Scale(root, from_=0, to=255, command=show)
rSlider.grid(row=0, column=0)
gSlider.grid(row=0, column=1)
bSlider.grid(row=0, column=2)
root.mainloop()
運行結果:
askcolor() 方法
在tkinter 模塊內的 colorchooser 模塊內有askcolor() 方法,這個方法可以開啓色彩
對話框,讓我們可以很方便的在此對話框中選擇我們需要的色彩
例子
:
import tkinter
from tkinter.colorchooser import *
def colorChoose():
mycolor = askcolor()
print(type(mycolor), mycolor)
root.config(bg=mycolor[1])
root = tkinter.Tk()
root.geometry("300x200")
button = tkinter.Button(root, text="Select Color", command=colorChoose)
button.pack()
root.mainloop()
運行結果:
type類型爲
<class 'tuple'> ((255.99609375, 128.5, 0.0), '#ff8000')
容器的應用
我們可以使用Frame框架當做容器,將三個色彩尺度條放在此框架內,方便我們去移動或者去管理
例子
:
import tkinter
def show(source):
# source 用於接收Scale 傳回來的參數
red = rSlider.get()
green = gSlider.get()
blue = bSlider.get()
myColor = "#%02x%02x%02x" % (red, green, blue) # %02x 轉成16進制,字母小寫空缺補零
root.config(bg=myColor)
root = tkinter.Tk()
root.geometry("300x200")
frame = tkinter.Frame(root)
frame.pack()
rSlider = tkinter.Scale(frame, from_=0, to=255, command=show)
gSlider = tkinter.Scale(frame, from_=0, to=255, command=show)
bSlider = tkinter.Scale(frame, from_=0, to=255, command=show)
rSlider.grid(row=0, column=0)
gSlider.grid(row=0, column=1)
bSlider.grid(row=0, column=2)
root.mainloop()
運行結果:
Spinbox 控件
Spinbox 控件基本概念
Spinbox 控件也是一種輸入控件,其實它是一種Entry和 Button的組合體,他允許用戶用鼠標單擊up/down
按鈕,或者是按上箭頭/下箭頭
達到在某一數值區間內增加數值與減少數值的目的。另外,也可以在此直接輸入數值
構造方法如下:
Spinbox(父對象, options, ...)
參數:
- 第一個參數:
父對象
,表示這個Spinbox將建立在哪一個窗口內 - 第二個參數:
options
,參數如下
參數 | 含義 |
---|---|
activebackground | 鼠標光標在Spinbox 控件上時的背景顏色 |
borderwidth | 3D邊界寬度 默認是兩個像素 |
bd | 3D邊界寬度 默認是兩個像素 |
bg | 背景顏色 |
command | 當使用者更改選項時,會自動執行此方法 |
cursor | 當鼠標光標在Spinbox 控件上時的形狀 |
disablebackground | 在Disabled狀態時的背景顏色 |
disableforeground | 在Disabled狀態時的前景顏色 |
fg | 文字前景色彩 |
font | 字形 |
format | 格式化的字符串 |
from_ | 範圍值的初值 |
increment | 每次單擊up/down按鈕的增值或減值的量 |
justify | 在有多行文本時,最後一行的對齊方式 可取值有LEFT/CENTER/RIGHT(靠左/居中/靠右) 默認是居中對齊 |
relief | 可由此更改邊界外觀 默認是FLAT |
repeatdelay | 可設置單擊up/down按鈕變換數字的間隔時間。單位是ms 默認是300 |
state | 若設置爲DISABLED,則暫時無法使用此Spinbox 默認是NORMAL,也可以設置READONLY |
textvariable | 可以設置以變量方式顯示 |
values | 可以是元組或其他序列值 |
to | 範圍值的末端值 |
width | 對於垂直尺度條這是槽的寬度,對於水平尺度條這是槽的高度 |
wrap | 單擊up/down按鈕可以讓數值重新開始 |
xscrollcommand | 在x軸使用滾動條 |
Spinbox 控件基本運用
例子
:
import tkinter
root = tkinter.Tk()
root.geometry("200x80")
spinbox = tkinter.Spinbox(root, from_=10, to=30, increment=2)
spinbox.pack(padx=5, pady=20)
root.mainloop()
運行結果:
備註:如果想要用上箭頭/下箭頭鍵更改數值時,需先將插入點放在數值區,也就是輸入時閃爍的光標
get() 方法的應用
可以使用get()方法取得目前Spinbox 的值
例子
:
import tkinter
def printNum():
print(spinbox.get())
root = tkinter.Tk()
root.geometry("200x80")
spinbox = tkinter.Spinbox(root, from_=10, to=30, command=printNum)
spinbox.pack(padx=5, pady=20)
root.mainloop()
運行結果:
以序列存儲 Spinbox的數值數據
其實在使用 Spinbox 時也可以不設置初值和終值, 而是將數值存儲在序列數據中。
例如,元組或列表內,當單擊上箭頭/下箭頭按鈕時,相當於是觀察元組或列表內索引(index)內的值
例子
:
import tkinter
def printNum():
print(spinbox.get())
root = tkinter.Tk()
root.geometry("200x80")
spinbox = tkinter.Spinbox(root, values=(1, 3, 5, 7, 9), command=printNum)
spinbox.pack(padx=5, pady=20)
root.mainloop()
運行結果:
因爲元組內容是(1, 3, 5, 7, 9),所以程序啓動後出現的值是1,第1次單擊按鈕時的值是3, 第2次單擊按鈕時的值是5
非數值數據
可以使用列表或元組存儲序列資料,其實應用在Spinbox內可以是數值數據也可以是非數值數據,例如,字符串
例子
:
import tkinter
def printNum():
print(spinbox.get())
foods = ("餃子", "湯圓", "春捲", "油條", "面窩", "熱乾麪")
root = tkinter.Tk()
root.geometry("200x80")
spinbox = tkinter.Spinbox(root, values=foods, command=printNum)
spinbox.pack(padx=5, pady=20)
root.mainloop()
運行結果:
謝謝觀看,筆者會持續更新,如有錯誤或者建議,請私信我