用Tkinter打造GUI開發工具(19)ttk.Notebook筆記本小部件

用Tkinter打造GUI開發工具(19)ttk.Notebook筆記本小部件
ttk.Notebook筆記本組件類似多頁的Frame,通過點擊頂部標籤的選項卡選擇不同容器。筆記本小部件的目的是提供一個區域,用戶可以通過單擊區域頂部的選項卡來選擇內容頁面,如下所示:
每次用戶單擊其中一個選項卡時,窗口小部件將顯示 與該選項卡關聯的子窗格。通常,每個窗格都是 Frame窗口小部件,但窗格可以是任何窗口小部件。
當前顯示的子窗格的選項卡稱爲選定選項卡。
您將使用Notebook窗口小部件的.add()方法附加新選項卡及其相關內容。其他方法允許您刪除或暫時隱藏選項卡。
每個選項卡都有自己的一組選項來控制其外觀和行爲。
要將Notebook窗口小部件創建爲某個窗口小部件的子parent窗口,請使用以下構造函數:

w= ttk.Notebook(parent,option= value,...)

ttk.Notebook選項包括:
在這裏插入圖片描述
ttk.Notebook小部件上的方法包括所有ttk小部件共有的方法”中描述的所有方法,以及以下方法:

.add(child, **kw)

該child 參數是一個小部件,通常Frame,它包裝一個子窗格中的內容。如果child不是Notebook窗口小部件的子窗格之一,child則添加爲下一個可用選項卡,關鍵字參數kw定義新窗格的選項卡選項。這些選項在表51“ ttk.Notebook 小部件的選項卡選項”中定義。
如果child是當前隱藏的窗格,則該選項卡將重新顯示在其以前的位置。

.enable_traversal()

一旦調用此方法,一些額外的鍵綁定將起作用:
Control-Tab將在當前選擇的選項卡後選擇選項卡。如果當前選擇了最後一個選項卡,則選擇將旋轉回第一個選項卡。
Shift-Control-Tab執行相反操作:它移動到上一個選項卡,如果選擇了第一個選項卡,則環繞到最後一個選項卡。
您可以配置直接選擇選項卡的特定熱鍵。要執行此操作,請使用text和underline選項卡選項爲每個選項卡中的一個字符加下劃線。然後,用戶可以通過鍵入Alt-跳轉到選項卡,x其中 x是該選項卡上帶下劃線的字符。
如果Notebook在同一個應用程序中有多個小部件,則除非創建每個子窗格小部件並將其Notebook窗口小部件作爲父窗口小部件,否則這些功能將無法正常工作。

.forget(child)

此方法child從窗口小部件的選項卡集中永久刪除指定的內容。

.hide(tabId)

標識的選項卡tabId暫時從中顯示的可見選項卡集中刪除Notebook。您可以通過.add() 再次調用該方法來恢復它。

.index(tabId)

對於給定的tabId,此方法返回相應選項卡的數字索引。有一個例外:如果參數是字符串"end",則該方法將返回選項卡的總數。

.insert(where, child,**kw)

此方法使用任何關鍵字參數將窗口小部件插入到child指定的位置 where,以描述新選項卡和窗格。有關關鍵字選項,請參閱表51“ ttk.Notebook 小部件的選項卡選項”。
該where 參數可以是任何的:
“end” 在所有現有選項卡之後放置新選項卡。
現有的子窗口小部件; 在這種情況下,new child就在現有小部件之前插入。

.select([tabId])

如果在沒有參數的情況下調用此方法,它將返回當前顯示其選項卡的窗口小部件的窗口名稱。
要顯示特定窗格Notebook,請使用a tabId作爲參數調用此方法。

.tab(tabId, option=None, **kw)

使用此方法可以爲所描述的子窗格設置選項卡選項tabId,或者找出爲該子窗格設置的選項。
如果您調用沒有關鍵字參數的方法,它將返回當前對指定的窗格有效的選項卡選項的字典tagId。
要查找特定選項卡選項的當前值 X,請使用參數“option=X” 調用此方法,該方法將返回該選項卡選項的值。
要爲描述的子項設置一個或多個選項卡選項tagId,請使用關鍵字參數調用此方法。例如,如果self.nb 是 Notebook,則此調用將更改第一個選項卡上顯示的文本:

self.nb.tab(0, text=‘Crunchy frog’)

.tabs()

此方法返回的列表窗口名稱中的Notebook的子窗格中,從第一個到最後的次序。
以下是.add()和 .tab()方法中使用的選項卡選項。
ttk.Notebook 小部件的選項卡選項。

在這裏插入圖片描述
ttk.Notebook 小部件的虛擬事件。每當選定的選項卡在ttk.Notebook小部件中更改時,它都會生成“ <>”虛擬事件。
下面看一個ttk.Notebook 小部件的演示程序.

# -*- coding: utf-8 -*-
import tkinter as tk  #裝載tkinter模塊,用於Python3
from tkinter import ttk  #裝載tkinter.ttk模塊,用於Python3

root =tk.Tk()  # 創建窗口對象
root.title(string = 'ttk.Notebook演示')  #設置窗口標題
root.geometry('400x300+200+200')

tabControl = ttk.Notebook(root)  #創建Notebook
tab1 = tk.Frame(tabControl,bg='blue')  #增加新選項卡
tabControl.add(tab1, text='信息窗')  #把新選項卡增加到Notebook
tab2 = tk.Frame(tabControl,bg='yellow')
tabControl.add(tab2, text='綜合信息')
tab3 = tk.Frame(tabControl,bg='green')
tabControl.add(tab3, text='技術分析')
tab4 = tk.Frame(tabControl,bg='blue')
tabControl.add(tab4, text='編寫代碼')
tab5 = tk.Frame(tabControl,bg='blue') 
tabControl.add(tab5, text='模擬回測')

tab6 = ttk.Frame(tabControl) 
tabControl.add(tab6, text='雙色球')
tab7 = ttk.Frame(tabControl) 
tabControl.add(tab7, text='大樂透')
tabControl.pack(expand=1, fill="both")

tabControl.select(tab1) #選擇tab1

root.mainloop()     # 進入消息循環

程序運行結果如下圖。
在這裏插入圖片描述
上面程序我們混合使用了tk和ttk的Frame組件。
ttk.Notebook爲我們的Tkinter增加了一個新的功能部件,但是這個部件的Tab名只能在左上角顯示,我們無法把它移動到左下角。
因此我們對 ttk.Notebook不滿意,可以自己設計一個Notebook2組件。
下面看我把我在HP_tk2中設計的Notebook2組件類展示給大家,大家可以參照此組件類設計更多的新組件。

 # -*- coding: utf-8 -*-
import tkinter as tk  #裝載tkinter模塊,用於Python3
from tkinter import ttk  #裝載tkinter.ttk模塊,用於Python3

#------------HP_tk2中Notebook2模塊
class Notebook2(tk.Frame): # 繼承Frame類的Notebook類
    def __init__(self, master=None,m=0,anchor=tk.NW, size=9,width=10,**kw):  
        tk.Frame.__init__(self, master,**kw)  
        self.root = master #定義內部變量root
        self.m=m
        self.width=width
        self.size=size
        self.anchor=anchor
        self.s1=tk.TOP
        self.s2=tk.BOTTOM
        if (self.anchor in [tk.SW,tk.S,tk.SE]):
            self.s1=tk.BOTTOM
            self.s2=tk.TOP
        self.t=[]
        self.v=[]
        self.view=None
        self.pack(side=self.s2, fill=tk.BOTH, expand=1,ipady=1,pady=1,ipadx=1,padx=1)

        self.tab()


    def add(self,tab=None,text=''):
        if (tab!=None):
            self.m=self.m+1
            def handler (self=self, i=self.m-1 ):
                self.select(i)
            
            if (self.anchor in [tk.NW,tk.N,tk.SW,tk.S]):
                self.button = tk.Button(self.tab, width=self.width,text=text, cursor='hand2',
                                        anchor=tk.S,
                                        font=('Helvetica', '%d'%self.size),
                                        command=handler)
                self.t.append(self.button)
                self.button.pack(side=tk.LEFT)
                self.v.append(tab)
                if (self.m==1):
                    self.select(0)


            if (self.anchor in [tk.NE,tk.SE]):
                self.button = tk.Button(self.tab, width=self.width,text=text, cursor='hand2',
                                        anchor=tk.S,
                                        font=('Helvetica','%d'%self.size),
                                        command=handler)
                self.t.append(self.button)
                self.button.pack(side=tk.RIGHT)
                self.v.append(tab)
                if (self.m==1):
                    self.select(0)


    def tab(self):
        self.tab=tk.Frame(self)
        if (self.anchor in [tk.N,tk.S]):
            self.tab.pack(side=self.s1)
        if (self.anchor in [tk.NW,tk.NE,tk.SW,tk.SE]):
            self.tab.pack(side=self.s1,fill=tk.X)

        
        for i in range(self.m):
            def handler (self=self, i=i ):
                self.select(i)
            self.button = tk.Button(self.tab, width=self.width,text='Tab%d'%i, cursor='hand2',
                                    anchor=tk.S,
                                    font=('Helvetica','%d'%self.size),
                                    command=handler)
            self.t.append(self.button)
            self.v.append(None)
            if (self.anchor in [tk.NW,tk.SW]) :
                self.button.pack(side=tk.LEFT)
            else:
                self.button.pack(side=tk.RIGHT)
            
        self.update()

         
    def frame(self):
        self.frame=tk.Frame(self,bd=2,
                            borderwidth=2,  #邊框寬度
                            padx=1,  #部件x方向間距
                            pady=1, #部件y方向間距
                            )
        self.frame.pack(side=self.s2,fill=tk.BOTH, expand=1)         


    def select(self,x):
        print(x)
        if (self.view!=None):
            self.view.pack_forget()
        for i in range(self.m):
            self.t[i]['relief']=tk.RIDGE
            self.t[i]['anchor']=tk.S
            self.t[i]['bg']="#F0F0ED"
            
        self.t[x]['anchor']=tk.N
        self.t[x]['bg']='white'
        self.view=self.v[x]
        if (self.view!=None):
            self.view.pack(fill=tk.BOTH, expand=1)   


    def modify(self,x,tab=None,text=''):
        if (x>self.m-1):
            return
        if (tab!=None):
            self.v[x]=tab
        if (text!=''):
            self.t[x]['text']=text
#------上面是class Notebook2定義

root =tk.Tk()  # 創建窗口對象
root.title(string = 'ttk.Notebook演示')  #設置窗口標題
root.geometry('800x600+200+200')

tabControl = ttk.Notebook(root)  #創建Notebook
tab1 = tk.Frame(tabControl,bg='blue')  #增加新選項卡
tabControl.add(tab1, text='信息窗')  #把新選項卡增加到Notebook
tab2 = tk.Frame(tabControl,bg='yellow')
tabControl.add(tab2, text='綜合信息')
tab3 = tk.Frame(tabControl,bg='green')
tabControl.add(tab3, text='技術分析')
tab4 = tk.Frame(tabControl,bg='blue')
tabControl.add(tab4, text='編寫代碼')
tab5 = tk.Frame(tabControl,bg='blue') 
tabControl.add(tab5, text='模擬回測')

tab6 = ttk.Frame(tabControl) 
tabControl.add(tab6, text='雙色球')
tab7 = ttk.Frame(tabControl) 
tabControl.add(tab7, text='大樂透')
tabControl.pack(expand=1, fill="both")

tabControl.select(tab1) #選擇tab1
#---------------演示1------------------------------------
mytabControl=Notebook2(tab1,anchor=tk.SW)
mytab1 = tk.Frame(mytabControl,bg='red')  #增加新選項卡
mytabControl.add(mytab1,text='信息1')
mytab2 = tk.Frame(mytabControl,bg='blue')  #增加新選項卡
mytabControl.add(mytab2,text='信息2')
mytab3 = tk.Frame(mytabControl,bg='yellow')  #增加新選項卡
mytabControl.add(mytab3,text='信息3')
#---------------演示2------------------------------------
mytabControl2=Notebook2(tab2,m=3)
mytabControl3=Notebook2(tab3,m=4,anchor=tk.SW)
mytabControl4=Notebook2(tab4,m=5,anchor=tk.S)
mytabControl5=Notebook2(tab5,m=4,anchor=tk.N)
mytabControl6=Notebook2(tab6,m=5,anchor=tk.SE)
mytabControl7=Notebook2(tab7,m=4,anchor=tk.NE)

root.mainloop()     # 進入消息循環

下面是運行結果。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

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