使用ttk选项卡中的小部件.笔记本



我正在尝试显示一个带有两个选项卡的简单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):
tk.Frame.__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, parent, *args, **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()

当我运行此程序时,它不会显示实际的笔记本。它只是将两个选项卡显示在一起。然而,当我用tk.Frame(self.tabholder)替换Tab(self.tabholder)时,它的功能非常好(除了不使用Tab()类的内容之外(。

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

EDIT:我发现真正的罪魁祸首是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)
...

最新更新