Tkinter 笔记本小部件

Tkinter Notebook widget

我正在尝试使用 ttk.Notebook 小部件创建多个选项卡。我正在创建一个简单的多标签记事本。但我不知道如何处理 NoteBook 小部件。但是当我单击保存按钮时,它会覆盖所有选项卡文本区域,因为我在那里声明 self.tx.get("1.0","end-1c")。所有写入的文件都根据最后一个文本更改其文本。谢谢你帮助我


    #-*- coding: utf-8 -*-

    import tkinter.ttk as ttks
    from tkinter import LEFT,RIGHT,X,Y,BOTH
    class MainUI:
        def __init__(self,master):
            self.master = master

            self.nb = ttks.Notebook(self.master)
            self.nb.pack(fill='both',expand=1)

            self.name = ttks.Entry(self.master)
            self.name.pack()
            self.save_tab = ttks.Button(self.master,text="save",command=lambda:self.save_file()).pack()
            #tab1
            self.page1 = ttks.Frame(self.nb)
            self.txt = ttks.tkinter.Text(self.page1)
            self.txt.pack(fill='both',expand=1)
            self.nb.add(self.page1,text="tab1")

            self.page2 = ttks.Frame(self.nb)
            self.nb.add(self.page2,text="tab2")
            self.master.bind('',self.add_tabs)

        def add_tabs(self,event):
            self.page_name = ttks.Frame(self.nb)
            self.tx = ttks.tkinter.Text(self.page_name)
            self.tx.pack(fill=BOTH,expand=1)
            self.nb.add(self.page_name,text="pagename")

        def save_file(self):
            self.fname = self.name.get()
            self.txtinput = self.tx.get("1.0","end-1c")
            with open(self.fname,'w') as f:
                f.write(self.txtinput)

    if __name__ == "__main__":
        root = ttks.tkinter.Tk()
        root.title('Tabs>>')
        root.geometry('500x500')
        MainUI(root)
    root.mainloop()

执行以下代码后出现以下异常

add_tabs 中,每次添加新选项卡时都会替换 self.tx 的值。 IE。您只记得最后创建的文本小部件。您需要:

  • 存储您创建的所有文本小部件(即使用列表)
  • 有一些方法可以在前台找到文本小部件,例如通过查看活动选项卡或焦点小部件。

__init__中添加:

self.txs = [] # "s" suffix to discern list and elements

add_tabs中,使用:

tx = ttks.tkinter.Text(self.page_name)
self.txs.append(tx) # append to list
tx.pack(...)

save_file中,使用:

tab_index = self.nb.index(self.nb.select())
tx = self.txs[tab_index + 1] # may need to adjust depending on how much "static" tabs are in front
txtinput = self.tx.get("1.0", "end-1c")
# ...