如何获取ttk.Notebook激活标签对应Text组件的文本内容
问题核心原因
你现有代码的问题是循环创建Text组件时,每次都会覆盖self.text变量,导致该变量最终只指向最后一个标签页的Text组件,无法关联每个标签页对应的Text实例。
解决方案
以下提供两种可直接落地的实现方式:
方案1:建立标签页与Text组件的映射字典(推荐,可维护性更高)
步骤1:修改初始化代码,新增映射存储
在创建ttk.Notebook前先初始化一个字典用于存储对应关系,循环创建组件时把每个标签页的Frame和对应的Text组件绑定:
import os import glob import tkinter as tk from tkinter import ttk # ... 你的类初始化其他代码 ... os.chdir('C://Users//Public//Documents') myNotes = glob.glob('*.txt') myNotes.append('+') self.notebook = ttk.Notebook(self.master) self.tab_text_map = {} # 新增:存储标签页Frame和对应Text组件的映射 for files in myNotes: if files != '+': with open('C://Users//Public//Documents//'+files,'r') as f: value = f.read() else: value='' notebook_tab = ttk.Frame(self.notebook) self.notebook.add(notebook_tab, text=files) text_widget = tk.Text(notebook_tab, bd=0, wrap='word') text_widget.pack(fill='both', expand=True) text_widget.insert('1.0', value) self.tab_text_map[notebook_tab] = text_widget # 新增:写入映射关系 self.notebook.pack(fill='both', expand=True)
步骤2:获取当前激活标签的文本内容并保存
需要保存时执行以下逻辑即可:
# 获取当前激活的标签页 current_tab = self.notebook.select() # 获取对应Text组件 current_text = self.tab_text_map[current_tab] # 获取Text内的全部内容,end-1c用于去掉Text组件默认末尾添加的多余换行 content = current_text.get('1.0', 'end-1c') # 获取当前标签对应的文件名 active_tab_name = self.notebook.tab(current_tab, "text") # 保存逻辑,排除+号标签的话可以加判断 if active_tab_name != '+': with open(f'C://Users//Public//Documents//{active_tab_name}', 'w', encoding='utf-8') as f: f.write(content)
方案2:直接从标签页子组件获取Text(无需修改原有初始化代码)
如果不想改动原有初始化逻辑,可以直接通过标签页Frame的子组件查找Text,因为每个标签页下只有Text一个子组件:
current_tab = self.notebook.select() # 取当前标签页的第一个子组件,就是对应的Text对象 current_text = current_tab.winfo_children()[0] content = current_text.get('1.0', 'end-1c') # 后续保存逻辑和方案1完全一致
补充说明
如果你的+号标签需要支持新建文件保存,可以额外加逻辑判断,当标签名是+时弹出输入框让用户输入新文件名,再写入对应文件即可。
内容的提问来源于stack exchange,提问作者Guinness
相关产品推荐
相关产品推荐

