微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在ttk.Notebook标签中使用小部件?

如何解决在ttk.Notebook标签中使用小部件?

我正在尝试显示一个带有两个标签的简单Notebook小部件。这是我尝试的代码,中间没有所有不必要的代码

import tkinter as tk
from tkinter import ttk

color_bg = "gray20"
font = "Lucida Sans Typewriter"
DEFAULT_FONT_SIZE = 16

class Tab(tk.Frame):
    def __init__(self,parent):
        tk.Frame.__init__(self,parent)
        self.parent = parent
        self.pack()

        self.textfield = tk.Text(
            self.parent,font = (font,DEFAULT_FONT_SIZE),background = color_bg,bd = 10,relief = tk.FLAT)

        self.textfield.pack(fill = tk.BOTH,expand = True)


class Tabdisplay(tk.Frame):
    def __init__(self,parent)
        self.parent = parent
        self.pack(fill = tk.BOTH,expand = True)

        self.tabholder = ttk.Notebook(parent)
        self.tabholder.pack(fill = tk.BOTH,expand = True,side = tk.TOP)

        self.viewtab = Tab(self.tabholder)
        self.edittab = Tab(self.tabholder)
        self.tabholder.add(self.viewtab,text = "View")
        self.tabholder.add(self.edittab,text = "Edit")


class MainApplication(tk.Frame):
    def __init__(self,parent,*args,**kwargs):
        tk.Frame.__init__(self,**kwargs)
        self.parent = parent

        # Set size and position
        self.x_pos = 0
        self.y_pos = 0
        self.width = self.parent.winfo_screenwidth()
        self.height = self.parent.winfo_screenheight()
        self.parent.geometry(f"{self.width}x{self.height}+{self.x_pos}+{self.y_pos}")
        self.parent.resizable = True

        # Add Widgets
        self.tabdisplay = Tabdisplay(self)


if __name__ == "__main__":
    root = tk.Tk()
    MainApplication(root).pack(fill = tk.BOTH,expand = True)
    root.mainloop()

运行此命令时,它不会显示实际的笔记本。它仅在彼此下方显示两个选项卡。但是,当我将Tab(self.tabholder)替换为tk.Frame(self.tabholder)时,它可以正常运行(除了不使用Tab()类的内容之外)。

为什么我的Tab()类不能正确显示它?在开始使用tk.Frame之前,我从未遇到过从ttk.Notebook()继承的类的问题。 ttk有问题吗?

编辑:此后,我发现真正的罪魁祸首是Tab()类中的Text小部件。现在我的问题是为什么添加小部件会损坏笔记本?

解决方法

想想像盒子的框架。您创建一个框,然后将小部件放在该框内。只是,在您的情况下,您要在框中创建小部件,但是在将它们添加到self.parent而不是self时将它们放置在框外。

创建从tk.Frame继承的类时,该类中的每个小部件都应是self的直接子代或子代。这样,该类的实例将成为一个独立的对象,可以是任何其他小部件的子级。

例如:

class Tab(tk.Frame):
    def __init__(self,parent):
        ...
        self.textfield = tk.Text(
            self,...

...和:

class TabDisplay(tk.Frame):
    def __init__(self,parent):
        ...
        self.tabholder = ttk.Notebook(self)
        ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。