簡體   English   中英

在 ttk.Notebook 的選項卡中使用小部件?

[英]Using widget in a tab of 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):
        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的問題嗎?

編輯:我后來發現真正的罪魁禍首是Tab()類中的 Text 小部件。 現在我的問題是為什么添加小部件會破壞筆記本?

把框架想象成一個盒子。 您創建一個盒子,然后將小部件放入盒子中。 只是,在您的情況下,您是在框中創建小部件,但在將它們添加到self.parent而不是self時將它們放置在框外。

當您創建一個繼承自tk.Frame的類時, 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)
        ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM