如何将Tkinter文本框内容保存为字符串变量并用作窗口标题?
问题解决及代码修改
核心问题梳理
- 代码未导入
tkinter模块,导致tk相关调用报错。 title是Setup.save()中的局部变量,Counter类无法直接读取该变量。Text组件的get('1.0', tk.END)会获取到文本末尾的换行符,导致窗口标题包含多余空白。- 创建多个
tk.Tk()实例不符合Tkinter规范,易引发异常,建议用Toplevel作为子窗口。
修改后的完整代码
import tkinter as tk from tkinter import messagebox class Setup: def __init__(self): # 主窗口布局 self.root = tk.Tk() self.root.geometry("500x300") self.root.title("Setup") self.label = tk.Label(self.root, text="Title of next window", font=('Arial', 18)) self.label.pack(padx=10, pady=10) self.textbox = tk.Text(self.root, height=1, font=('Arial', 16)) self.textbox.pack(padx=50, pady=10) self.button = tk.Button(self.root, text="Save", font=('Arial', 18), command=self.save) self.button.pack(padx=10, pady=10) self.root.protocol("WM_DELETE_WINDOW", self.on_closing) self.root.mainloop() def on_closing(self): if messagebox.askyesno(title="Quit?", message="Do you really want to quit?"): self.root.destroy() def save(self): # 获取文本并去除首尾空白(包括换行符) title = self.textbox.get('1.0', tk.END).strip() # 将title作为参数传给Counter类 Counter(self.root, title) # 可选:关闭Setup窗口 self.root.destroy() class Counter: def __init__(self, parent, window_title): # 使用Toplevel创建子窗口,而非新的Tk实例 self.root = tk.Toplevel(parent) self.root.geometry("500x300") self.root.title(window_title) Setup()
修改说明
- 补全
import tkinter as tk,解决模块未导入问题。 - 用
.strip()处理文本框内容,移除多余换行和空白字符,保证标题格式正常。 - 将
title作为参数传递给Counter的构造函数,让子窗口能接收并使用标题内容。 - 把
Counter中的tk.Tk()替换为tk.Toplevel(parent),基于主窗口创建子窗口,规避多Tk实例引发的异常。如果需要关闭原设置窗口,可保留self.root.destroy()语句。
内容的提问来源于stack exchange,提问作者livymio
相关产品推荐
相关产品推荐

