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

tkinter的選項卡組件Notebook詳細講解

我今天要講解的Notebook組件也是一款ttk組件,我們稱之選項卡組件。它是一款容器組件,它跟Frame類似,它也可以裝入很多組件,這些組件我們可以分類裝入不同的選項卡,對于管理是很方便的。

創建Notebook組件語法: Notebook(父組件,參數…..)

    參數:

        height : 組件高度

        width : 組件寬度

        padding : 設置組件四周的額外空間的尺寸

 

裝入其它組件到Notebook的方法:add(子對象,參數…..)

    參數:

        text : 選項卡的字符串名稱

        state : 選項:normal,  disabled(禁止),  hidden(隱藏)

        image : 選項卡插入圖片

        compound :選項卡上同時顯示圖片和文字時,彼此之間的位置關系

        padding : 各選項卡里,組件跟選項卡里的四周間距

 

我們先來創建一個Notebook組件,然后創建2個框架frame組件fr1,fr2, 再后,通過add方法,把2個框架裝入相應的選項卡里,并自動生成選項卡。

以后,想裝入更多的組件,只要把裝入的組件的父組件設為fr1,fr2y 就行了。

下面用代碼來實現:

from tkinter import *
from tkinter.ttk import *
 
root=Tk()
root.geometry('300x150+888+444')
 
note1=Notebook(root) # 1 創建Notebook組件
note1.pack(fill=BOTH,expand=True)
 
fr1=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡1的容器框架
fr2=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡2的容器框架
 
note1.add(fr1,text='選項卡1') # 3 裝入框架1到選項卡1
note1.add(fr2,text='選項卡2') # 3 裝入框架2到選項卡2
 
but1=Button(fr1,text='按鈕1').pack() # 4 把相關的組件裝入對應的框架里
la1=Label(fr2,text='標簽1',background='blue',foreground='white').grid()
 
root.mainloop()

運行結果:                                             

由上面2圖可見:

1. 加到到2個選項卡里的2個框架都自動擴展到全部選項卡的范圍;

2. 加入到2個框架的組件,由于父組件的不同,可以分別用pack()grid()來布局定位,互不干擾。

3. 創建其它組件,只要父組件分別為fr1,fr2,就可以裝入更多的組件。

 

padding參數:

在上面的代碼中,Notebook組件在窗體是居中顯示的,fr1,fr22個框架在選項頁中也是居中顯示的。如果想讓它們不居中顯示,如何做到呢?對Notebook組件還好辦,在pack()方法用padx,pady參數就可以做到。但2個框架在選項頁中沒有辦法用padx,pady2個參數?,F在這2種情況都可以用padding這個參數來搞定。

padding=(a,b,c,d)   # padding可提供14個參數來控制組件的左上右下4個邊跟外部組件之間的間距。

提供1,2,3,4個參數不同,表示的意思也不同,具體見下圖:

3.PNG

padding=10   # 表示跟4周都保持10個像素的間距

   padding=(10,20)  # 表示左右跟外部組件保持10個像素間距,上下保持20個像素間距

   …… 其他情況,看上圖,以此類推.....丶丌皛

下面以代碼的情況,來演示一下:

from tkinter import *
from tkinter.ttk import *
 
root=Tk()
root.geometry('300x150+888+444')
 
note1=Notebook(root,padding=(10,10,10,20)) # 1 創建Notebook組件
note1.pack(fill=BOTH,expand=True)
 
fr1=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡1的容器框架
fr2=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡2的容器框架
 
note1.add(fr1,text='選項卡1',padding=10) # 3 裝入框架1到選項卡1
note1.add(fr2,text='選項卡2',padding=(20,20,5,5)) # 3 裝入框架2到選項卡2
 
but1=Button(fr1,text='按鈕1').pack() # 4 把相關的組件裝入對應的框架里
la1=Label(fr2,text='標簽1',background='blue',foreground='white').grid()
 
root.mainloop()

運行后,Notebook組件,2個框架都按padding的設置到了新的位置


選項框可以文字和圖片同時顯示,這樣好看一點,我來演示一下,其實很簡單,就跟標簽設置文字和圖片同時顯示一樣,只要在add()方法里加image, compound2個參數。(當然之前要創建好圖像對象)

from tkinter import *
from tkinter.ttk import *
 
root=Tk()
root.geometry('300x150+888+444')
 
note1=Notebook(root) # 1 創建Notebook組件
note1.pack(fill=BOTH,expand=True)
 
fr1=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡1的容器框架
fr2=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡2的容器框架
 
img1=PhotoImage(file='16-1.png')
note1.add(fr1,text='選項卡1',image=img1,compound='left') # 3 裝入框架1到選項卡1
note1.add(fr2,text='選項卡2') # 3 裝入框架2到選項卡2
 
but1=Button(fr1,text='按鈕1').pack() # 4 把相關的組件裝入對應的框架里
la1=Label(fr2,text='標簽1',background='blue',foreground='white').grid()
 
root.mainloop()

運行結果,選項卡1多了一個圖片。作者網站 wb98.com

6.PNG

 

默認情況下,選項頁都在左上角開始,可是有些情況,我們希望選項頁從別的位置開始,這就要樣式設置。樣式設置有一個參數tabpostition,它的選項跟以前學的anchor有點類似,下面代碼來演示一下。

from tkinter import *
from tkinter.ttk import *
 
root=Tk()
root.geometry('300x150+888+444')
 
style1 = Style()
style1.configure('my.TNotebook', tabposition='se') # 'se'再改nw,ne,sw,se,w,e,wn,ws,en,es,n,s試試
 
note1=Notebook(root,style='my.TNotebook') # 1 創建Notebook組件
note1.pack(fill=BOTH,expand=True)
 
fr1=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡1的容器框架
fr2=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡2的容器框架
 
note1.add(fr1,text='選項卡1') # 3 裝入框架1到選項卡1
note1.add(fr2,text='選項卡2') # 3 裝入框架2到選項卡2
 
but1=Button(fr1,text='按鈕1').pack() # 4 把相關的組件裝入對應的框架里
la1=Label(fr2,text='標簽1',background='blue',foreground='white').grid()
 
root.mainloop()

運行結果

7.PNG 

 

tabpostition=’se’ tabpostition=’wn’ 再運行一下,結果:

8.PNG

 大家自行把tabpostition參數改nw,ne,sw,se,w,e,wn,ws,en,es,n,s試試

 

 Notebook相關方法:

除了上面講的add()方法,Notebook還有很多方法可用,我講解幾個我掌握的方法。

1. hide(TabID)  # 隱藏某選項卡,如 note1.hide(1)   TabID為選項卡序號

2. forget(child)  # 永久刪除選項卡

3. add(child,text) # add(child) 恢復隱藏選項卡,加上新的text值,還可改名

4. select(TabID)  # 選中某選項卡

 

以下用代碼來演示一下上面講的幾個方法。 丶丌皛

from tkinter import *
from tkinter.ttk import *
 
root=Tk()
root.geometry('350x150+888+444')
 
note1=Notebook(root,padding=5) # 1 創建Notebook組件
note1.pack(fill=BOTH,expand=True)
 
fr1=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡1的容器框架
fr2=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡2的容器框架
fr3=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡3的容器框架
 
note1.add(fr1,text='選項卡1') # 3 裝入框架1到選項卡1
note1.add(fr2,text='選項卡2') # 3 裝入框架2到選項卡2
 
but1=Button(fr1,text='按鈕1').pack() # 4 把相關的組件裝入對應的框架里
la1=Label(fr2,text='標簽1',background='blue',foreground='white').grid()
 
fr4=Frame(root,relief='ridge',borderwidth=1) # 準備裝入4個按鈕
fr4.pack()
 
note1.select(1) # 選中第2個選項卡
# note1.select(fr2) # 也可以用這種方法,選中第2個選項卡
 
Button(fr4,text="隱藏",command=lambda:note1.hide(1)).pack(side=LEFT) # 隱藏選項卡2(id=1)
Button(fr4,text="新增",command=lambda:note1.add(fr3,text='新加項3')).pack(side=LEFT) # 新增選項卡
Button(fr4,text="恢復",command=lambda:note1.add(fr2)).pack(side=LEFT)  # 恢復隱藏的選項卡2
Button(fr4,text="刪除",command=lambda:note1.forget(fr3)).pack(side=LEFT)  # 永久刪除選項卡3
 
root.mainloop()

運行結果:

 9.PNG

 

再講幾個方法:

1. insert(TabID,child,text)  # 在某個選項卡前插入一個新的選項卡

  insert(1, fr3, text=’新插入的選項卡’)

     insert(’END’, fr3, text=’最后位置插入選項卡’)

 

2. tab(TabID, 參數…)   # tab()方法操作選項卡

  note1.tab(1,text=’改個名’)  # 為第2個選項卡改名

     note1.tab(1,state='disabled')  # 2個選項卡禁止操作

     note1.tab(1,state=’normal’)  # 2個選項卡狀態正常

     note1.tab(1,’text’)  # 返回第2個選項卡的文本

     note1.tab(1,’state’)  # 返回第2個選項卡的狀態

     note1.tab(1)  # 省略第2個參數,就返回所有參數的的字典

 

3. index(TabID) # 返回選項卡的索引值,如果TabID’end’ 返回選項卡的總數量

  index(fr1)  #  返回值為0

     index(‘current’)  # 返回鼠標點擊處的選項卡的索引值(序號)

 

如何即時得到當前選項卡的索引值(序號)? 這可以用到Notebook組件的一個虛擬事件:

<<NotebookTabChanged>>  # 當選項卡發生改變時,此事件發生

 

下面我用代碼演示上述方法,并演示 <<NotebookTabChanged>>虛擬事件得到當前的選項卡序號。

from tkinter import *
from tkinter.ttk import *
 
root=Tk() # 源碼來自wb98.com
root.geometry('350x150+888+444')
 
note1=Notebook(root,padding=5) # 1 創建Notebook組件
note1.pack(fill=BOTH,expand=True)
 
fr1=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡1的容器框架
fr2=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡2的容器框架
fr3=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡3的容器框架
 
note1.add(fr1,text='選項卡1') # 3 裝入框架1到選項卡1
note1.add(fr2,text='選項卡2') # 3 裝入框架2到選項卡2
 
but1=Button(fr1,text='按鈕1').pack() # 4 把相關的組件裝入對應的框架里
la1=Label(fr2,text='標簽1',background='blue',foreground='white').grid()
 
note1.select(1) # 選中第2個選項卡
N=note1.index(1) # 得到第2個選項卡的序號
root.title('當前選項卡序號:'+ str(N)) # 用窗體標題來顯示當前的選項卡序號
 
fr4=Frame(root,relief='ridge',borderwidth=1) # 準備裝入4個按鈕
fr4.pack()
 
def newk():
    note1.insert(1,fr3,text='插入的卡') # 插入新選項卡
    note1.select(1) # 選中插入的選項卡
 
Button(fr4,text="插入",command=newk).pack(side=LEFT) # 插入選項卡(id=1)
Button(fr4,text="改名",command=lambda:note1.tab(1,text='改個名稱')).pack(side=LEFT) # 第2個選項卡改名
Button(fr4,text="禁止",command=lambda:note1.tab(1,state='disabled')).pack(side=LEFT)  # 第2個選項卡禁止操作
Button(fr4,text="可用",command=lambda:note1.tab(1,state='normal')).pack(side=LEFT)  # 第2個選項卡恢復正常操作
 
def selectjob(event):
    print('-------------')
    root.title('當前選項卡序號:'+ str(note1.index(note1.select()))) # 鼠標點擊處的選項卡的序號
    print('當前選項卡文本:',note1.tab(note1.select(),'text')) # 返回選中選項卡的文本
    print('當前選項卡參數字典:',note1.tab(note1.select())) # 返回選中選項卡的參數字典
 
note1.bind('<<NotebookTabChanged>>',selectjob) # 選項卡發生變動時觸發此事件
 
root.mainloop()

運行結果

 10.PNG

上面代碼,用鼠標點擊選項卡,會觸發虛擬事件<<NotebookTabChanged>>其實,你用鍵盤操作ctrl + Tab ctrl + shift + Tab 選擇選項卡,也同樣解決虛擬事件<<NotebookTabChanged>>

 

在編寫一個簡單的tkinterttk)程序里,我們編寫多窗體時,可以在一個窗體里偽裝成多窗體,可以通過FrameLabelFrame組件來裝入“不同窗體”的組件,然后通過顯示或隱藏FrameLabelFrame來達到切換不同窗體的效果。

我想,我們也可以通過隱藏Notebook組件的選項卡,然后把“不同窗體”的組件裝入不同的選項卡里,操作選項卡,以達到多窗體切換的效果。

隱藏選項卡,要樣式Style操作,代碼:

style1 = Style()

style1.layout('TNotebook.Tab', []) # 隱藏選項卡

 

全部代碼測試一下:

from tkinter import *
from tkinter.ttk import *
 
root=Tk()
root.geometry('350x150+888+444')
 
style1 = Style()
style1.layout('TNotebook.Tab', []) # 隱藏選項卡
 
note1=Notebook(root,padding=5) # 1 創建Notebook組件
note1.pack(fill=BOTH,expand=True)
 
fr1=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡1的容器框架
fr2=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡2的容器框架
 
note1.add(fr1,text='選項卡1') # 3 裝入框架1到選項卡1
note1.add(fr2,text='選項卡2') # 3 裝入框架2到選項卡2
 
but1=Button(fr1,text='按鈕1--選項卡1').pack() # 4 把相關的組件裝入對應的框架里
la1=Label(fr2,text='標簽1--選項卡2',background='blue',foreground='white').grid()
 
note1.select(1) # 選中第2個選項卡
 
fr4=Frame(root,relief='ridge',borderwidth=1) # 準備裝入4個按鈕
fr4.pack()
 
Button(fr4,text="選項卡1",command=lambda:note1.select(0)).pack(side=LEFT) # 選中第1個選項卡
Button(fr4,text="選項卡2",command=lambda:note1.select(1)).pack(side=LEFT) # 選中第2個選項卡
 
root.mainloop()

運行結果:

 11.PNG


下面講一下如何更改選項卡上的字體顏色及大小,這也要通過Style樣式操作

。
style1 = Style()
style1.configure('TNotebook.Tab',font=('宋體',22,'bold'),foreground='red')
 # 設置選項卡字體,大小,顏色


以下是全部代碼

from tkinter import *
from tkinter.ttk import *
 
root=Tk() # 源碼來自wb98.com
root.geometry('350x150+888+444')
 
style1 = Style()
style1.configure('TNotebook.Tab',font=('宋體',22,'bold'),foreground='red')
 # 設置選項卡字體,大小,顏色
 
note1=Notebook(root,padding=5) # 1 創建Notebook組件
note1.pack(fill=BOTH,expand=True)
 
fr1=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡1的容器框架
fr2=Frame(root,relief='ridge',borderwidth=1) # 2 創建選項卡2的容器框架
 
note1.add(fr1,text='選項卡1') # 3 裝入框架1到選項卡1
note1.add(fr2,text='選項卡2') # 3 裝入框架2到選項卡2
 
but1=Button(fr1,text='按鈕1--選項卡1').pack() # 4 把相關的組件裝入對應的框架里
la1=Label(fr2,text='標簽1--選項卡2',background='blue',foreground='white').grid()
 
note1.select(1) # 選中第2個選項卡
 
fr4=Frame(root,relief='ridge',borderwidth=1) # 準備裝入4個按鈕
fr4.pack()
 
Button(fr4,text="選項卡1",command=lambda:note1.select(0)).pack(side=LEFT) # 選中第1個選項卡
Button(fr4,text="選項卡2",command=lambda:note1.select(1)).pack(side=LEFT) # 選中第2個選項卡個選項卡恢復正常操作
 
root.mainloop()

運行結果

12.PNG

Notebook組件功能還是很強大的,要學的知識很多,我也只是學了一點皮毛,先講解到這里,以后有機會再就這個組件進行交流。

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

下一篇文章,我來講解另一個ttk組件:進度條Progressbar


來源:濟亨網

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

    << 上一篇 下一篇 >>

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

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