使用Tkinter Python 3的文本编辑器

使用Tkinter Python 3的文本编辑器,python,tkinter,save,text-editor,text-widget,Python,Tkinter,Save,Text Editor,Text Widget,我正在尝试构建一个包含不同选项卡的文本编辑器,每个选项卡都是一个文件,但问题是,当我尝试保存文件时,它没有读取任何内容,而是创建了一个没有内容的新文件。以前,我没有Tab类,它可以工作,但问题是它保存了所有具有相同内容的文件 代码如下: from tkinter import * from tkinter import filedialog, ttk import os class App(): def __init__(self): title = 'New documen

我正在尝试构建一个包含不同选项卡的文本编辑器,每个选项卡都是一个文件,但问题是,当我尝试保存文件时,它没有读取任何内容,而是创建了一个没有内容的新文件。以前,我没有Tab类,它可以工作,但问题是它保存了所有具有相同内容的文件

代码如下:

from tkinter import *
from tkinter import filedialog, ttk
import os

class App():
    def __init__(self):

    title = 'New document'
    self.root = Tk()
    self.root.geometry('300x200')
    self.root.iconbitmap('icon.ico')
    self.root.title(title)


    self.tabs = {'ky': 0}
    self.notebook = ttk.Notebook(self.root)
    self.notebook.pack(expand = True, fill= 'both')


    menubar = Menu(self.root)
    # create a pulldown menu, and add it to the menu bar
    filemenu = Menu(menubar, tearoff=0)
    filemenu.add_command(label="New...", command=self.generate_tab)
    filemenu.add_command(label="Open", command = self.open_file)
    filemenu.add_command(label="Save", command= self.save_file)
    filemenu.add_separator()
    filemenu.add_command(label="Exit", command= self.root.quit)
    menubar.add_cascade(label="File", menu = filemenu)

    editmenu = Menu(menubar, tearoff=0)
    editmenu.add_command(label="Undo")
    editmenu.add_command(label="Redo")
    editmenu.add_separator()
    menubar.add_cascade(label="Edit", menu=editmenu)
    self.root.config(menu=menubar)

def open_file(self):
    file = open(filedialog.askopenfilename(), 'r+')
    text_value = file.read()
    self.textWidget.delete(1.0, "end-1c")
    self.textWidget.insert("end-1c", text_value)
    title = os.path.basename(file.name)
    self.root.title(title)
    file.close()

def add_tab(self, name):
    tab = Tab(self.notebook, name)
    print(name)
    self.notebook.add(tab, text=name)

def save_file(self):
    self.get_tab().save_tab()

def get_tab(self):
    tab = Tab(self.notebook, 'Document ' + str(self.notebook.index('current')))
    return tab

def generate_tab(self):
    if self.tabs['ky'] < 20:
        self.tabs['ky'] += 1
        self.add_tab('Document ' + str(self.tabs['ky']))

def run(self):
    self.root.mainloop()

class Tab(Frame):

def __init__(self, root, name):
    Frame.__init__(self, root)

    self.root = root
    self.name = name

    self.textWidget = Text(self)
    self.textWidget.pack(expand=True, fill='both')

def save_tab(self):
    print(self.textWidget.get("1.0", 'end-1c'))
    file = open(filedialog.asksaveasfilename() + '.txt', 'w+')
    file.write(self.textWidget.get("1.0", 'end-1c'))
    print(os.path.basename(file.name))
    #title = os.path.basename(file.name)
    file.close()



if __name__ == '__main__':
    app1 = App()
    app1.run()
从tkinter导入*
从tkinter导入文件对话框,ttk
导入操作系统
类App():
定义初始化(自):
标题='新文档'
self.root=Tk()
self.root.geometry('300x200')
self.root.iconbitmap('icon.ico'))
self.root.title(title)
self.tabs={'ky':0}
self.notebook=ttk.notebook(self.root)
self.notebook.pack(expand=True,fill='both')
菜单栏=菜单(self.root)
#创建下拉菜单,并将其添加到菜单栏
filemenu=Menu(menubar,tearoff=0)
filemenu.add_命令(label=“New…”,command=self.generate_选项卡)
filemenu.add_命令(label=“Open”,command=self.Open_文件)
filemenu.add_命令(label=“Save”,command=self.Save_文件)
filemenu.add_separator()
filemenu.add_命令(label=“Exit”,command=self.root.quit)
menubar.add_级联(label=“File”,menu=filemenu)
编辑菜单=菜单(菜单栏,TEAROF=0)
editmenu.add_命令(label=“Undo”)
editmenu.add_命令(label=“Redo”)
编辑菜单。添加分隔符()
菜单栏.add_级联(label=“Edit”,menu=editmenu)
self.root.config(menu=menubar)
def open_文件(自身):
file=open(filedialog.askopenfilename(),'r+')
text_value=file.read()
self.textWidget.delete(1.0,“end-1c”)
self.textWidget.insert(“end-1c”,text\u值)
title=os.path.basename(file.name)
self.root.title(title)
file.close()文件
def添加选项卡(自身,名称):
tab=tab(self.notebook,name)
印刷品(名称)
self.notebook.add(选项卡,文本=名称)
def保存_文件(自身):
self.get_tab().save_tab()
def get_选项卡(自身):
tab=tab(self.notebook,'Document'+str(self.notebook.index('current'))
返回选项卡
def生成_选项卡(自身):
如果self.tabs['ky']<20:
self.tabs['ky']+=1
self.add_选项卡('Document'+str(self.tabs['ky']))
def运行(自):
self.root.mainloop()
类别选项卡(框架):
定义初始化(self、root、name):
帧.\uuuu init\uuuuu(self,root)
self.root=根
self.name=名称
self.textWidget=Text(self)
self.textWidget.pack(expand=True,fill='both')
def保存选项卡(自身):
打印(self.textWidget.get(“1.0”,“end-1c”))
file=open(filedialog.asksaveasfilename()++'.txt',w++)
file.write(self.textWidget.get(“1.0”,“end-1c”))
打印(os.path.basename(file.name))
#title=os.path.basename(file.name)
file.close()文件
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app1=App()
app1.run()

问题在于您的
获取选项卡
方法。它实际上并不返回表示当前打开的选项卡的对象。它返回一个没有内容的新选项卡

为了解决您的问题,您需要保留已创建选项卡的记录。我已经创建了一个“可行”版本,在创建每个选项卡时将其对象添加到列表中。这样,如果您当前处于“文档3”中并按“保存”,它将获得与文档3相关的选项卡对象

from tkinter import *
from tkinter import filedialog, ttk
import os

class App():
    def __init__(self):

        title = 'New document'
        self.root = Tk()
        self.root.geometry('300x200')
        #self.root.iconbitmap('icon.ico')
        self.root.title(title)


        self.tabs = {'ky': 0}
        #Keep a record of the open tabs in a list.
        self.tab_list = []
        self.notebook = ttk.Notebook(self.root)
        self.notebook.pack(expand = True, fill= 'both')


        menubar = Menu(self.root)
        # create a pulldown menu, and add it to the menu bar
        filemenu = Menu(menubar, tearoff=0)
        filemenu.add_command(label="New...", command=self.generate_tab)
        filemenu.add_command(label="Open", command = self.open_file)
        filemenu.add_command(label="Save", command= self.save_file)
        filemenu.add_separator()
        filemenu.add_command(label="Exit", command= self.root.quit)
        menubar.add_cascade(label="File", menu = filemenu)

        editmenu = Menu(menubar, tearoff=0)
        editmenu.add_command(label="Undo")
        editmenu.add_command(label="Redo")
        editmenu.add_separator()
        menubar.add_cascade(label="Edit", menu=editmenu)
        self.root.config(menu=menubar)

    def open_file(self):
        file = open(filedialog.askopenfilename(), 'r+')
        text_value = file.read()
        self.textWidget.delete(1.0, "end-1c")
        self.textWidget.insert("end-1c", text_value)
        title = os.path.basename(file.name)
        self.root.title(title)
        file.close()

    def add_tab(self, name):
        tab = Tab(self.notebook, name)
        print(name)
        self.notebook.add(tab, text=name)
        self.tab_list.append(tab)

    def save_file(self):
        tab_to_save = self.get_tab()
        print(tab_to_save)
        tab_to_save.save_tab()

    def get_tab(self):
        print(self.notebook.index('current'))
        #Get the tab object from the tab_list based on the index of the currently selected tab
        tab = self.tab_list[self.notebook.index('current')]
        return tab

    def generate_tab(self):
        if self.tabs['ky'] < 20:
            self.tabs['ky'] += 1
            self.add_tab('Document ' + str(self.tabs['ky']))

    def run(self):
        self.root.mainloop()

class Tab(Frame):

    def __init__(self, root, name):
        Frame.__init__(self, root)

        self.root = root
        self.name = name

        self.textWidget = Text(self)
        self.textWidget.pack(expand=True, fill='both')

    def save_tab(self):
        print(self.textWidget.get("1.0", 'end-1c'))
        file = open(filedialog.asksaveasfilename() + '.txt', 'w+')
        file.write(self.textWidget.get("1.0", 'end-1c'))
        print(os.path.basename(file.name))
        #title = os.path.basename(file.name)
        file.close()



if __name__ == '__main__':
    app1 = App()
    app1.run()
从tkinter导入*
从tkinter导入文件对话框,ttk
导入操作系统
类App():
定义初始化(自):
标题='新文档'
self.root=Tk()
self.root.geometry('300x200')
#self.root.iconbitmap('icon.ico'))
self.root.title(title)
self.tabs={'ky':0}
#在列表中记录打开的选项卡。
self.tab_list=[]
self.notebook=ttk.notebook(self.root)
self.notebook.pack(expand=True,fill='both')
菜单栏=菜单(self.root)
#创建下拉菜单,并将其添加到菜单栏
filemenu=Menu(menubar,tearoff=0)
filemenu.add_命令(label=“New…”,command=self.generate_选项卡)
filemenu.add_命令(label=“Open”,command=self.Open_文件)
filemenu.add_命令(label=“Save”,command=self.Save_文件)
filemenu.add_separator()
filemenu.add_命令(label=“Exit”,command=self.root.quit)
menubar.add_级联(label=“File”,menu=filemenu)
编辑菜单=菜单(菜单栏,TEAROF=0)
editmenu.add_命令(label=“Undo”)
editmenu.add_命令(label=“Redo”)
编辑菜单。添加分隔符()
菜单栏.add_级联(label=“Edit”,menu=editmenu)
self.root.config(menu=menubar)
def open_文件(自身):
file=open(filedialog.askopenfilename(),'r+')
text_value=file.read()
self.textWidget.delete(1.0,“end-1c”)
self.textWidget.insert(“end-1c”,text\u值)
title=os.path.basename(file.name)
self.root.title(title)
file.close()文件
def添加选项卡(自身,名称):
tab=tab(self.notebook,name)
印刷品(名称)
self.notebook.add(选项卡,文本=名称)
self.tab\u list.append(选项卡)
def保存_文件(自身):
tab_to_save=self.get_tab()
打印(制表符保存)
tab_to_save.save_tab()
def get_选项卡(自身):
打印(self.notebook.index('current'))
#根据当前选定选项卡的索引,从选项卡列表中获取选项卡对象
tab=self.tab\u列表[self.notebook.index('current')]
返回选项卡
def生成_选项卡(自身):
如果self.tabs['ky']<20:
self.tabs['ky']+=1
self.add_选项卡('Document'+str(self.tabs['ky']))
def运行(自):
self.root.mainloop()
类别选项卡(框架):
定义初始化(self、root、name):
帧.\uuuu init\uuuuu(self,root)
self.root=根
self.name=名称
self.textWidget=Text(self)
self.textWidget.pack(expand=True,fill='both')
def保存选项卡(自身):
打印(self.textWidget.get(“1.0”,“end-1c”))
file=open(filedialog.asksaveasfilename()++'.txt',w++)
file.write(self.textWidget.get(“1.0”,“end-1c”))
打印(os.path.basena)