Python 有没有一种方法可以将自定义笔记本和普通笔记本结合起来,使所有标签都在一个级别上

Python 有没有一种方法可以将自定义笔记本和普通笔记本结合起来,使所有标签都在一个级别上,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我不久前在这里找到了允许在tkinter中的笔记本选项卡上添加关闭按钮的代码,但我希望能够将常规笔记本(没有关闭按钮)与自定义笔记本结合起来。当我尝试这样做时,我得到了一组常规笔记本的标签,然后在它下面是另一组自定义笔记本的标签 正如所建议的,我在下面的图片中显示了当前发生的情况,但我正在寻找的是将所有选项卡放在一起(其中红色将与橙色、绿色、蓝色等选项卡对齐),但没有允许其关闭的x 我一直试图修改的代码是: import tkinter as tk import tkinter.ttk as

我不久前在这里找到了允许在tkinter中的笔记本选项卡上添加关闭按钮的代码,但我希望能够将常规笔记本(没有关闭按钮)与自定义笔记本结合起来。当我尝试这样做时,我得到了一组常规笔记本的标签,然后在它下面是另一组自定义笔记本的标签

正如所建议的,我在下面的图片中显示了当前发生的情况,但我正在寻找的是将所有选项卡放在一起(其中红色将与橙色、绿色、蓝色等选项卡对齐),但没有允许其关闭的x

我一直试图修改的代码是:

import tkinter as tk
import tkinter.ttk as ttk

#----------------------------------------------------------

class CustomNotebook(ttk.Notebook):
    '''
    A ttk Notebook with close buttons
    on each tab
    '''
    __initialized = False

    #------------------------------------------------------
    def __init__(self, *args, **kwargs):
        if not self.__initialized:
            self.__initialize_custom_style()
            self.__inititialized = True

        kwargs['style'] = 'CustomNotebook'
        ttk.Notebook.__init__(self, *args, **kwargs)

        self._active = None

        self.bind('<ButtonPress-1>', self.on_close_press, True)
        self.bind('<ButtonRelease-1>', self.on_close_release)

    #------------------------------------------------------
    def on_close_press(self, event):
        '''
        Called when the button is pressed
        over the close button
        '''
        element = self.identify(event.x, event.y)

        if 'close' in element:
            index = self.index('@%d,%d' % (event.x, event.y))
            self.state(['pressed'])
            self._active = index

    #------------------------------------------------------
    def on_close_release(self, event):
        '''
        Called when the button is released
        over the close button
        '''
        if not self.instate(['pressed']):
            return

        element =  self.identify(event.x, event.y)
        index = self.index('@%d,%d' % (event.x, event.y))

        if 'close' in element and self._active == index:
            self.forget(index)
            self.event_generate('<<NotebookTabClosed>>')

        self.state(['!pressed'])
        self._active = None

    #------------------------------------------------------
    def __initialize_custom_style(self):
        style = ttk.Style()
        self.images = (
            tk.PhotoImage('img_close', data='''
                R0lGODlhCAAIAMIBAAAAADs7O4+Pj9nZ2Ts7Ozs7Ozs7Ozs7OyH+EUNyZWF0ZWQg
                d2l0aCBHSU1QACH5BAEKAAQALAAAAAAIAAgAAAMVGDBEA0qNJyGw7AmxmuaZhWEU
                5kEJADs=
                '''),
            tk.PhotoImage('img_closeactive', data='''
                R0lGODlhCAAIAMIEAAAAAP/SAP/bNNnZ2cbGxsbGxsbGxsbGxiH5BAEKAAQALAAA
                AAAIAAgAAAMVGDBEA0qNJyGw7AmxmuaZhWEU5kEJADs=
                '''),
            tk.PhotoImage('img_closepressed', data='''
                R0lGODlhCAAIAMIEAAAAAOUqKv9mZtnZ2Ts7Ozs7Ozs7Ozs7OyH+EUNyZWF0ZWQg
                d2l0aCBHSU1QACH5BAEKAAQALAAAAAAIAAgAAAMVGDBEA0qNJyGw7AmxmuaZhWEU
                5kEJADs=
                ''')
            )

        style.element_create('close', 'image', 'img_close',
            ('active', 'pressed', '!disabled', 'img_closepressed'),
            ('active', '!disabled', 'img_closeactive'), border=8, sticky='')
        style.layout('CustomNotebook', [('CustomNotebook.client', {'sticky': 'nswe'})])
        style.layout('CustomNotebook.Tab', [
            ('CustomNotebook.tab', {
                'sticky': 'nswe', 
                'children': [
                    ('CustomNotebook.padding', {
                        'side': 'top', 
                        'sticky': 'nswe',
                        'children': [
                            ('CustomNotebook.focus', {
                                'side': 'top', 
                                'sticky': 'nswe',
                                'children': [
                                    ('CustomNotebook.label', {'side': 'left', 'sticky': ''}),
                                    ('CustomNotebook.close', {'side': 'left', 'sticky': ''}),
                                ]
                            })
                        ]
                    })
                ]
            })
        ])

#----------------------------------------------------------

if __name__ == '__main__':
    root = tk.Tk()

    note = ttk.Notebook(width=200, height=200)
    note.pack(side='top', fill='both', expand=True)
    notebook = CustomNotebook(width=200, height=200)
    notebook.pack(side='top', fill='both', expand=True)

    for color in ('red', 'orange', 'green', 'blue', 'violet'):
        if color == 'red':
            frame = tk.Frame(note, background=color)
            note.add(frame, text=color)
        else:
            frame = tk.Frame(notebook, background=color)
            notebook.add(frame, text=color)

    root.mainloop()
将tkinter作为tk导入
将tkinter.ttk导入为ttk
#----------------------------------------------------------
类自定义笔记本(ttk.Notebook):
'''
带有关闭按钮的ttk笔记本
在每个选项卡上
'''
__初始化=错误
#------------------------------------------------------
定义初始化(self,*args,**kwargs):
如果不是自初始化的:
self.\u初始化\u自定义\u样式()
self.\uuu initialized=True
kwargs['style']='CustomNotebook'
ttk.Notebook.\uuuu init\uuuuuu(self,*args,**kwargs)
自激活=无
self.bind(“”,self.on\u close\u press,True)
自我绑定(“”,自我关闭释放)
#------------------------------------------------------
def on_close_按下(自身,事件):
'''
按下按钮时调用
在关闭按钮上
'''
元素=自我识别(事件x、事件y)
如果元素中有“关闭”:
index=self.index(“@%d,%d%”(event.x,event.y))
self.state(['pressed']))
自激活=索引
#------------------------------------------------------
def on_close_释放(自身、事件):
'''
释放按钮时调用
在关闭按钮上
'''
如果不是自行安装([“按下]):
返回
元素=自我识别(事件x、事件y)
index=self.index(“@%d,%d%”(event.x,event.y))
如果元素中的“关闭”和self.\u active==索引:
自我忘记(索引)
自我事件_生成(“”)
self.state(['!pressed'])
自激活=无
#------------------------------------------------------
定义\初始化\自定义\样式(自):
style=ttk.style()
self.images=(
tk.PhotoImage('img_close',数据=''
R0LGODLHCAAAIAMIBAAAADS7O4+PJ9NZ2TS7OZS7OZS7OZS7OYS7OYH+EUNyZWF0ZWQg
D2L0ACBHSU1QACH5BAEKAAQALAAAAAAAIAAGAAAMVGDBEA0QNJYGW7AMXMUAZHWEU
5kEJADs=
'''),
tk.PhotoImage('img_closeactive',数据=''
r0lgodlhcaaiamieaaaap/SAP/bnnz2cbgxsbgxsbgxih5baekaaqalaaa
aaaiaagaaamvgdbea0qnjygw7amxmuazhweu5ejads=
'''),
tk.PhotoImage('img_closepressed',数据=''
R0LGODLHCAAAIAMIEAAAAOUQKV9MZTNZ2TS7OZS7OZS7OZS7OYS7OYH+EUNyZWF0ZWQg
D2L0ACBHSU1QACH5BAEKAAQALAAAAAAAIAAGAAAMVGDBEA0QNJYGW7AMXMUAZHWEU
5kEJADs=
''')
)
style.element_create('close'、'image'、'img_close',
(“激活”、“按下”、“禁用”、“img_关闭按下”),
('active'、'!disabled'、'img_closeactive')、border=8、sticky=')
布局('CustomNotebook',[('CustomNotebook.client',{'sticky':'nswe'})])
style.layout('CustomNotebook.Tab'[
(“CustomNotebook.tab”{
“粘性”:“nswe”,
“儿童”:[
(“CustomNotebook.padding”{
“侧面”:“顶部”,
“粘性”:“nswe”,
“儿童”:[
(“CustomNotebook.focus”{
“侧面”:“顶部”,
“粘性”:“nswe”,
“儿童”:[
('CustomNotebook.label',{'side':'left','sticky':'''}),
('CustomNotebook.close',{'side':'left','sticky':'''}),
]
})
]
})
]
})
])
#----------------------------------------------------------
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=tk.tk()
注=ttk.笔记本(宽=200,高=200)
注意:打包(side='top',fill='both',expand=True)
笔记本=定制笔记本(宽=200,高=200)
notebook.pack(side='top',fill='both',expand=True)
对于(‘红色’、‘橙色’、‘绿色’、‘蓝色’、‘紫色’)中的颜色:
如果颜色=‘红色’:
框架=传统框架(注,背景=颜色)
注释.添加(框架,文本=颜色)
其他:
框架=传统框架(笔记本,背景=颜色)
notebook.add(框,文本=颜色)
root.mainloop()
我猜我必须使用定制笔记本,并导致其中一个选项卡不使用关闭功能,但我不知道如何实现这一点。非常感谢您的帮助


我还要感谢Bryan Oakley提供了CustomNotebook类,我在以下帖子中找到了该类:

“使所有选项卡都处于一个级别”:您的问题并显示一个图像来解释此行为。“其中,
[red]
将与
[orange x]
内联。”:您创建了两个
笔记本
您希望如何内联这些?是否要使用
CustomNotebook
,但要将每个选项卡配置为不同的,例如使用和不使用
X
?是的,这正是我要查找的。我知道创建两个笔记本不起作用,但我不知道如何使用customNotebook创建没有x.Far的选项卡