如何解决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")
这是初始化过程,CustomText
是tkinter.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
中。您还需要在文本编辑器上调用pack
,place
或grid
,以使其在选项卡中可见:
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 举报,一经查实,本站将立刻删除。