當前位置:首頁 ? tkinter ? 正文

ttk基本知識 - tkinter中文手冊

今天開始講解一下TTK基本知識,我們前面講了不少組件,這個組件都是tkinter模塊里的組件,這些組件在外觀上主要是經典風格(經典灰),在外貌協會的人的眼中,這太土了,希望tkinter組件在外觀上有所改進,所以,應用戶需求,ttk模塊來了。

這個ttk模塊里除我們前面學的12個組件:Button,Lable,Frame,LabelFrame,Radiobutton,Checkbutton,Entry,Menu,PaneWindow,Scale,Spinbox,Scrollbar 還增加了6個ttk獨有的組件:Combobox,Notebook,Progressbar,Separator,Sizegrip,Treeview

ttk組件在外觀樣式上是跟系統相統一的主題,在外觀上好看多了,但要注意,ttk在外觀樣式的設置上,跟tkinter模塊的組件有些不一樣,它可以靠ttk的style類來實現,作為后續的ttk模塊對tkinter的兼容性并不好,比如,以前我們設置背景顏色bg,前景顏色fg,就不可以用了。

用ttk組件時,當然需要先導入ttk模塊。上篇文章有導入ttk模塊的說明,下面我再用代碼來說明ttk的一些基本知識。

首先來看看tkinter和ttk模塊在外觀的區別,下面代碼對6個組件在2個模塊下進入了對比顯示,讓大家有一個感性認識。

import tkinter as tk
import tkinter.ttk as ttk
 
root=tk.Tk()
 
fr1=tk.LabelFrame(root,text='tk.LableFrame') # 不設置邊線寬,無法顯示
fr1.pack(padx=10,pady=10)
fr2=ttk.LabelFrame(root,text='ttk.LableFrame') # 不設置邊線寬,無法顯示
fr2.pack(padx=10,pady=10)
 
but1=tk.Button(fr1,text="按鈕1")
but1.pack(side='left',padx=10,pady=10)
 
but2=ttk.Button(fr2,text="按鈕2")
but2.pack(side='left',padx=10,pady=10)
 
la1=tk.Label(fr1,text='標簽1',bg='lightblue')
la1.pack(side='left',padx=10,pady=10)
 
la2=ttk.Label(fr2,text='標簽2',background='lightblue')
la2.pack(side='left',padx=10,pady=10)
 
var1=tk.IntVar()
ra1=tk.Radiobutton(fr1,text='單選按鈕1',variable=var1,value=1)
ra1.pack(side='left',padx=10,pady=10)
 
ra2=ttk.Radiobutton(fr2,text='單選按鈕2',variable=var1,value=2)
ra2.pack(side='left',padx=10,pady=10)
 
var2=tk.IntVar()
ch1=tk.Checkbutton(fr1,text="多選按鈕1",variable=var1)
ch1.pack(side='left',padx=10,pady=10)
 
var3=tk.IntVar()
ch2=ttk.Checkbutton(fr2,text="多選按鈕1",variable=var3)
ch2.pack(side='left',padx=10,pady=10)
 
sca1=tk.Scale(fr1,from_=0,to=255,orient=tk.HORIZONTAL)
sca1.pack(side='left',padx=10,pady=10)
 
sca2=ttk.Scale(fr2,from_=0,to=255,orient=tk.HORIZONTAL)
sca2.pack(side='left',padx=10,pady=10)
 
root.mainloop()

運行結果

    1.PNG

 

由上可見,除了標簽外,其它組件在風格上還是有明顯的不同,ttk風格的確跟系統的主題更統一,看上去,也更舒服一些了。

 

在上面代碼,對于標簽 la2的創建是:

la2=ttk.Label(fr2,text='標簽2',background='lightblue')


在tkinter的背景顏色設置上,用bg和用background都是可以的,但是,在ttk里是不支持bg,fg的,你可以把上面代碼改成  bg='lightblue' 再去試一下,肯定出錯。

 

那如何知道ttk組件支持什么參數,我們在創建la1,la2完以后,在代碼加入

print(la1.keys())
print('----------------------')
print(la2.keys())

運行后,會輸出:

['activebackground', 'activeforeground', 'anchor', 'background', 'bd', 'bg', 'bitmap', 'borderwidth', 'compound', 'cursor', 'disabledforeground', 'fg', 'font', 'foreground', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'image', 'justify', 'padx', 'pady', 'relief', 'state', 'takefocus', 'text', 'textvariable', 'underline', 'width', 'wraplength']

----------------------

['background', 'foreground', 'font', 'borderwidth', 'relief', 'anchor', 'justify', 'wraplength', 'takefocus', 'text', 'textvariable', 'underline', 'width', 'image', 'compound', 'padding', 'state', 'cursor', 'style', 'class']

 

由此可見,采取ttk模塊的la2標簽可采用的參數里,沒有bg,只有background,但采用tkinter模塊里就有bg這個參數。這方面的知識不用強記,多編程,多編碼,自然就記住了。

  

style()方法,設置 

我們知道ttk組件可以通過sytle對象來設置組件的外觀等?,F在我來用代碼演示一下。

from tkinter import *
from tkinter.ttk import *
 
root=Tk()
 
but1=Button(root,text="wb98.com",background='blue',foreground='red',font=('黑體',12,'bold'))
but1.pack()
 
root.mainloop()

以上代碼想在窗體創建一個按鈕,設置按鈕的背景顏色為紅色,前景顏色為紅色,字體為黑體,但是,運行后,噫,出錯了。

以上情況最常出現在新手剛從tkinter轉到ttk來的時候,上面代碼導入tkinter,ttk的通配符方式,決定ttk模塊的組件會覆蓋掉tkinter模塊下的同名組件,所以,在上面代碼應該按照ttk設置組件外觀樣式的方法,而不要沿用以前的方法 ,ttk模塊設置方法是用style對象。下面我先來講一下如何運用style對象及方法,其中ttk樣式名的取名有規定,這個大家要強記一下。

 

Style對象創建方法: 對象名=Style()

例如:

    style1=Style()

    s2=Style()

    wb98=Style()

 

Style對象設置方法:對象實例.configure('ttk樣式名', 樣式參數......)

例如:

style1.configure('TButton', background='blue',foreground='red')

s2.configure('my.TButton', background='blue',foreground='red')

wb98.configure('.', background='blue',foreground='red')

 

上面說的Style對象創建很簡單,接著講的configure設置方法也不難,關鍵是ttk樣式名是有強制規定的:

 

如果你是為所有組件設置,系統已經強制ttk樣式名為:'.'

    例如:Style對象名. configure('.', background='blue',foreground='red')

    設置成功后,窗體上的所有組件:按鈕,標簽,單選按鈕……等都被設置成藍色背景色,紅色前景色。

 

 

如果你是為某類組件設置,系統也有強制ttk樣式名:

大部分樣式名都在組件類名的前面加大寫的T

組件類

ttk樣式名

Button

TButton

Checkbutton

TCheckbutton

Radiobutton

TRadiobutton

Entry

TEntry

Combobox

TCombobox

Frame

TFrame

Label

TLabel

LabelFrame

TLabelFrame

Notebook

TNtebook

Menubutton

TMenubutton

PanedWindow

TPandwindow   ( 不是TpandWindow )

Progressbar

Horizontal.TProgressbar   Vertical.TProgressbar

Scale

Horizontal.TScale      Vertical.TScale

Scrollbar

Horizontal.TScrollbar    Vertical.TScrollbar

Sizegrip

TSizegrip

Separator

TSeparator

Treeview

Treeview    ( 不是 TTreeview  )

 

例如:Style對象名. configure('TButton', background='blue',foreground='red')

設置成功后,窗體上所有的按鈕都被設置成藍色背景色,紅色前景色,其它的組件,如標簽,單選按鈕等是不會接受影響的。

 

如果你只是為窗體上某一個單獨的組件設置,其它同類的組件不受影響,你需要為這個單獨設置的組件起一個樣式名,樣式名的格式是:自取的名字.組件類的強制名。

例如:我的一個按鈕取樣式名:my.TButton

      我的一個標簽取樣式名:wb86.TLabel


下面結合上面講解的知識,建立一個窗體,窗體上有3個組件,2個按鈕,一個標簽,我先為所有窗體上的組件進行設置,然后為窗體所有的按鈕進行設置,再后,我只為其中的一個按鈕進行設置。

先看看在ttk模塊下,默認的樣式是怎么樣式吧:

from tkinter import *
from tkinter.ttk import *
 
root=Tk()
 
but1=Button(root,text="我是按鈕1")
but1.pack(padx=60,pady=10)
 
but2=Button(root,text="我是按鈕2")
but2.pack(padx=60,pady=10)
 
la1=Label(root,text='我是標簽')
la1.pack(padx=60,pady=10)
 
root.mainloop()

運行結果:

2.PNG

好了,大家記住上面的運行圖,我先讓所有的組件的樣式都變一下,我在組件創建前加入style樣式代碼。

from tkinter import *
from tkinter.ttk import *
 
root=Tk()
 
style1 = Style() # 創建Style對象,便于下面設置樣式
style1.configure('.',background='blue',foreground='red',font=('黑體',12))
#設置背景顏色為藍色,前景顏色為紅色,'.'為所有組件的樣式名
 
but1=Button(root,text="我是按鈕1")
but1.pack(padx=60,pady=10)
 
but2=Button(root,text="我是按鈕2")
but2.pack(padx=60,pady=10)
 
la1=Label(root,text='我是標簽')
la1.pack(padx=60,pady=10)
 
root.mainloop()

運行結果

3.PNG

運行后,由于設置的樣式名是:’.’  ,所以窗體上的三個組件,不管是按鈕還是標簽的外觀樣式都改變了。

 

好了,下面我們只改變按鈕樣式,不改變標簽的樣式:

from tkinter import *
from tkinter.ttk import *
 
root=Tk()
 
style1 = Style() # 創建Style對象,便于下面設置樣式
style1.configure('TButton',background='blue',foreground='red',font=('黑體',12))
#設置背景顏色為藍色,前景顏色為紅色,'TButton'為所有按鈕組件的樣式名
 
but1=Button(root,text="我是按鈕1")
but1.pack(padx=60,pady=10)
 
but2=Button(root,text="我是按鈕2")
but2.pack(padx=60,pady=10)
 
la1=Label(root,text='我是標簽')
la1.pack(padx=60,pady=10)
 
root.mainloop()

運行結果

4.PNG

由于只設置了按鈕的樣式(’TButton’),所以只有2個按鈕的外觀樣式有了變化,標簽還是默認的樣子。

 

下面,我進一步,只改變第1個按鈕的樣式,由于只是改變某個組件類的部分組件,這時,就需要為這個樣式取一個自定義的名字:my.TButton

from tkinter import *
from tkinter.ttk import *
 
root=Tk()
 
style1 = Style() # 創建Style對象,便于下面設置樣式
style1.configure('my.TButton',background='blue',foreground='red',font=('黑體',12))
#設置背景顏色為藍色,前景顏色為紅色,'my.TButton'為部分按鈕組件的樣式名
 
but1=Button(root,text="我是按鈕1",style='my.TButton')
but1.pack(padx=60,pady=10)
 
but2=Button(root,text="我是按鈕2")
but2.pack(padx=60,pady=10)
 
la1=Label(root,text='我是標簽')
la1.pack(padx=60,pady=10)
 
root.mainloop()

運行結果

5.PNG 

    測試成功,2個按鈕中,只有按鈕1樣式有變化,另一個按鈕是默認的樣式,標簽也是默認的樣式。

 

請大家看清楚代碼,一方面,Style對象設置時,在樣式名是自定義 my.TButton ,另一方面,在要設置按鈕的創建代碼中,一定要加一個參數 style='my.TButton' ,這2地方的變動缺一不可,否則不能成功。

 

主題theme

各種風格統一的樣式組件在一起,就組成了主題,ttk自帶有幾個主題,不同的電腦系統支持不同的主題,我們先來列出自己電腦系統支持的tkinter所有的主題。

from tkinter import *
from tkinter.ttk import *
 
root=Tk()
 
style1 = Style() # 創建Style對象,便于下面設置樣式
print(style1.theme_names()) # 輸出本機ttk所有主題風格
print(style1.theme_use()) # 輸出現在采用的那種主題
 
root.mainloop()

運行后,輸入結果:(本人的電腦系統是window10)

('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')

vista

 

可見,返回主題是一個所有主題的元組。

我的電腦采取的主題是 vista

 

用tkinter模塊是不方便做程序的美化工作,導入ttk模塊后,我們利用ttk模塊支持的主題,做一個換膚程序就容易了。下面我們就來做一個換膚程序吧。

采取某款ttk主題的方法是: style1.theme_use('主題名')

在下面的代碼里,tyle1.theme_names() 方法得到本題支持主題元組,作為optionmenu組件的列表項,供大家選擇換主題。

from tkinter import *
from tkinter.ttk import *
 
root=Tk()  # 源碼來自wb98.com
 
root.columnconfigure(0,weight=1,minsize=150) # 0列 限制最小寬度為150像素
root.columnconfigure(1,weight=1,minsize=150) # 1列 限制最小寬度為150像素
 
fr1=Frame(root) # fr1是作為窗體的底色而創建的
fr1.place(x=0,y=0,relwidth=1,relheight=1) # 參數保證fr1跟窗體一樣大小
 
style1 = Style() # 創建Style對象,便于下面設置樣式
 
tuple_op=style1.theme_names() # 返回值是本機ttk所有主題風格的元組
var=StringVar()
 
def changejob(cs): # 參數正好就是選擇項的文本
    style1.theme_use(cs)
  
op1=OptionMenu(root,var,*tuple_op,command=changejob) # 用下拉列表組件來選擇主題
op1.grid()
var.set(style1.theme_use()) # 組件默認選項設為目前的主題
 
lfr1=LabelFrame(root,text='單選') # 裝入3個單選按鈕
lfr1.grid(row=1,column=0,sticky='nswe',padx=10,pady=10)
 
var1=IntVar()
ra1=Radiobutton(lfr1,text='蘋果',variable=var1,value=1).pack()
ra1=Radiobutton(lfr1,text='西瓜',variable=var1,value=2).pack()
ra1=Radiobutton(lfr1,text='葡萄',variable=var1,value=3).pack()
var1.set(1)
 
lfr2=LabelFrame(root,text='多選') # 裝入3個多選按鈕
lfr2.grid(row=1,column=1,sticky='nswe',padx=10,pady=10)
var2,var3,var4=IntVar(),IntVar(),IntVar()
ch1=Checkbutton(lfr2,text="足球",variable=var2).pack()
ch2=Checkbutton(lfr2,text="田徑",variable=var3).pack()
ch3=Checkbutton(lfr2,text="游泳",variable=var4).pack()
var3.set(True)
var4.set(True)
 
fr1=Frame(root) # 框架裝入2個按鈕
fr1.grid(row=2,column=0,columnspan=2,sticky=W+E,pady=(0,10))
 
but1=Button(fr1,text=" 退 出 ",command=root.destroy)
but1.pack(side=RIGHT,padx=(10,30))
but2=Button(fr1,text=" 確 定 ")
but2.pack(side=RIGHT)
 
root.mainloop()

運行結果:                       丶丌皛

 

上述都是用官方提供的主題包,加載速度不錯,樣式也還行。

我曾試過第三方的主題包,由于是以圖片的形式來做主題包,加載速度在啟動時,慢了好幾秒,我放棄了,tkinter做為解釋性語言本來就慢了,只是為了好看的界面而降低反映速度太多,本末倒置了。

 

此文章來自:wb98.com  網站還有相關的系列課程文章,感興趣的可以前往。

下一篇文章,我來講第一款TTK組件combobox

 


來源:濟亨網

本文鏈接:http://www.chinaengraver.com/post/335.html

    << 上一篇 下一篇 >>

    湘公網安備 43011102000514號 - 湘ICP備08100508號

    2019年秋霞鲁丝片瓜皮_导航亚洲AV日韩AV永久无码_有没有哪些可以看片的免费的_国产色妞妞在线视频免费播放