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

Python Tkinter-使用ttk.Notebook和tkinter.Text

如何解决Python Tkinter-使用ttk.Notebook和tkinter.Text

我遇到以下问题,我试图添加一个功能,一次打开多个文件。众所周知,tkinter.ttk.Notebook可以做到这一点。每个标签都是一个ttk.Frame。现在,我还有一个tkinter.Text用户代码,它是一个文本编辑器),我正在尝试添加它。但这并不需要该参数(框架)。这是我现在拥有的代码

from tkinter import ttk
from pyedit.main import TextEditor

class Files:
    def __init__(self,master) -> None:

        self.master = master
        self.tabbar = ttk.Notebook(master)
        self.tabbar.bind("<<NotebookTabChanged>>",self.update_file)

    def add_file(self,filename) -> None:
        tab = ttk.Frame(self.tabbar)

        if filename is None:
            name = "Untitled"
            self.tabbar.add(tab,text=name)

        else:
            self.tabbar.add(tab,text=filename)

        self.tabbar.pack(expand=1,fill="BOTH")

        self.texteditor = TextEditor(self.master,filename)
        self.texteditor.open_file()

    def update_file(self,event) -> None:
        filename = self.get_file()
        self.texteditor.bar.current_file = filename

    def get_file(self) -> str:
        return self.tabbar.tab(self.tabbar.select(),"text")

这是初始化过程,CustomTexttkinter.Text的子类,但具有行号:

self.text = CustomText(
            self.master,yscrollcommand=self.y_scrollbar.set,xscrollcommand=self.x_scrollbar.set,highlightcolor="white",wrap=NONE,undo=True
        )
class TextEditor(Frame):
    def __init__(self,master,filename,tab) -> None:
        super().__init__(master)

        self.master = master
        self.filename = filename
        self.tab = tab
        self.line_numbers = TextLineNumbers(self,width=20)
        self.Syntax = Syntax(master)
        self.add_scrollbar()

    def add_scrollbar(self) -> None:
        self.y_scrollbar = Scrollbar(self.tab)
        self.x_scrollbar = Scrollbar(self.tab,orient="horizontal")
        self.y_scrollbar.pack(side=RIGHT,fill=Y)
        self.x_scrollbar.pack(side=BottOM,fill=X)
        self.line_numbers.pack(side="left",fill=Y)

        self.text = CustomText(
            self.tab,undo=True
        )

        self.text.pack(fill=BOTH,side=RIGHT,expand=True)

        self.text.bind("<<Change>>",self.on_change)
        self.text.bind("<Configure>",self.on_change)
        self.text.bind("<keyrelease>",self.on_key_release)

        self.y_scrollbar.config(command=self.text.yview)
        self.x_scrollbar.config(command=self.text.xview)
        self.line_numbers.attach(self.text)

这是我在其中创建文本框的TextEditor类。这些应该在每个选项卡上创建。在同一文件main.py上,我有一个run函数

def run(filename) -> None:
    root = Tk()
    root.title("PyEdit")
    Syntax = Syntax(root)
    Syntax.load_colors()
    old_colors = Syntax.colors
    files = Files(root)
    tab = files.add_file(None)
    texteditor = TextEditor(root,tab)
    texteditor.pack(side="top",fill=BOTH,expand=True)
    texteditor.add_toolbar()
    root.mainloop()
    if old_colors != Syntax.colors:
        Syntax.save_colors()

这是我第一次尝试添加标签页。

解决方法

由于我无法运行您提供的代码,因此我只能猜测问题所在。看起来很错误的一件事是这一行代码:

self.texteditor = TextEditor(self.master,filename)

您在此之前创建了一个新标签,因此应将文本编辑器放在tab中,而不要放在self.master中。您还需要在文本编辑器上调用packplacegrid,以使其在选项卡中可见:

self.texteditor = TextEditor(tab,filename)
self.texteditor.pack(fill="both",expand=True)

此外,由于要创建多个文本编辑器,因此将其存储在self.texteditor中是没有意义的,因为每次创建新标签时,该文本编辑器都会被覆盖。您可以将其存储为局部变量,和/或将其附加到编辑器列表中。

另一个问题是这一行:

self.text = CustomText(
            self.tab,...

您不应将CustomText放在self.tab中。它必须在self中。通常,如果要继承Frame并添加小部件,则所有其他小部件都需要放入self或后代中。

我看到的另一个问题是,每次添加文件时您都在呼叫self.tabbar.pack(expand=1,fill="BOTH")。实际创建self.tabbar时只需调用一次。

这些可能不是唯一的问题,但是由于您没有提供有效的示例,我只能按照发布的代码中看到的内容进行操作。

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