首页 > 解决方案 > 带有 Tkinter Python 3 的文本编辑器

问题描述

我正在尝试构建一个具有不同选项卡的文本编辑器,每个选项卡都是一个文件,但问题是当我尝试保存文件时,它什么也没有读取,它会创建一个没有内容的新文件。在我没有 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()

标签: pythontkintersavetext-editortext-widget

解决方案


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

为了解决您的问题,您需要记录您创建的选项卡。我创建了一个“可行”的版本,它在创建每个选项卡时将它们的对象添加到列表中。这样,如果您当前在“文档 3”中并按保存,它将获得与文档 3 相关的 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}
        #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()

推荐阅读