Tkinter Entry执行delete操作后保留已输入姓名字符串的解决方法
问题原因
你的Entry组件和name这个StringVar做了双向绑定,调用getname.delete(0,'end')清空输入框内容时,绑定的name变量也会同步被清空,后续调用name.get()拿到的就是空字符串,所以Q1_1里的姓名会缺失。
修复方案
新增一个全局变量专门存储已经提交的姓名,不要直接依赖和输入框绑定的StringVar取值,修改后代码如下:
# 原有代码无需修改的部分保持不变 #NameInfo NameInfo = ttk.Label(root, font=("Calibri", 14), text="Bitte geben Sie zuerst Ihren (eigenen) Namen ein:") NameInfo.grid(column=0, row=3, sticky=tk.NW, padx=0, pady=0) #Name name = tk.StringVar() getname = ttk.Entry(root, textvariable=name) getname.grid(column=0, row=4, sticky=tk.NW, padx=0, pady=0) #SaveName SaveName = ttk.Button(root, text="Speichern", command=lambda: DisplayWelcome()) SaveName.grid(column=1, row=4, sticky=tk.NW, padx=0, pady=0) #DisplayWelcome def DisplayWelcome(): # 新增全局变量存储提交的姓名 global saved_name saved_name = name.get().strip() global DisplayWelcome1 # 这里也可以直接用saved_name替代name.get(),效果一致 DisplayWelcome1 = ttk.Label(root, font=("Calibri", 14), text=(str('Hallo, ' + saved_name + ' :)'))) DisplayWelcome1.grid(column=0, row=5, sticky=tk.NW, padx=0, pady=0) global DisplayWelcome2 DisplayWelcome2 = ttk.Label(root, font=("Calibri", 14), text="xxx") DisplayWelcome2.grid(column=0, row=6, sticky=tk.NW, padx=0, pady=0) global DisplayWelcome3 DisplayWelcome3 = ttk.Label(root, font=("Calibri", 14), text="xxx") DisplayWelcome3.grid(column=0, row=7, sticky=tk.NW, padx=0, pady=0) global ForwardButton ForwardButton = ttk.Button(root, text="Weiter", command=lambda: ForwardButtonClicked()) ForwardButton.grid(column=0, row=8, sticky=tk.NW, padx=0, pady=0) getname.delete(0,'end') #ForwardButtonClicked def ForwardButtonClicked(): HelloInfo1.grid_remove() HelloInfo2.grid_remove() img_label.grid_remove() NameInfo.grid_remove() getname.grid_remove() SaveName.grid_remove() DisplayWelcome1.grid_remove() DisplayWelcome2.grid_remove() DisplayWelcome3.grid_remove() ForwardButton.grid_remove() global Q1_1 # 这里用存储好的saved_name替代name.get() Q1_1 = ttk.Label(root, font=("Calibri", 14), text=(str('Ok, ' + saved_name + ' xxx'))) Q1_1.grid(column=0, row=0, sticky=tk.NW, padx=0, pady=0)
其他优化建议
如果不想用全局变量,也可以把业务逻辑封装成类,用类属性存储用户输入的姓名,可维护性更好。
内容的提问来源于stack exchange,提问作者ne0
相关产品推荐
相关产品推荐

