如何在Tkinter GUI程序中实现指定输入规则与保存逻辑?
解决Tkinter GUI程序的三个功能需求
以下是修改后的完整代码,已实现你提出的全部要求:
from tkinter import * from tkinter import messagebox # 导入消息框模块用于提示 class GUI: def __init__(self, window): self.window = window self.frame_name = Frame(self.window) self.label_name = Label(self.frame_name, text='Name') self.entry_name = Entry(self.frame_name) self.label_name.pack(padx=5, side='left') self.entry_name.pack(padx=5, side='left') self.frame_name.pack(anchor='w', pady=10) self.frame_age = Frame(self.window) self.label_age = Label(self.frame_age, text='Age') self.entry_age = Entry(self.frame_age) self.label_age.pack(padx=9, side='left') self.entry_age.pack(padx=9, side='left') self.frame_age.pack(anchor='w', pady=10) self.frame_status = Frame(self.window) self.label_status = Label(self.frame_status, text='Status') self.label_status.pack(padx=5, side='left') self.rbtn = StringVar() self.rbtn.set('none') self.rbutton_student = Radiobutton(self.frame_status, text='Student', variable=self.rbtn, value="Student") self.rbutton_student.pack(padx=10, side='left') self.rbutton_staff = Radiobutton(self.frame_status, text='Staff', variable=self.rbtn, value="Staff") self.rbutton_staff.pack(padx=10, side='left') self.rbutton_both = Radiobutton(self.frame_status, text='Both', variable=self.rbtn, value="Both") self.rbutton_both.pack(padx=10, side='left') self.frame_status.pack(anchor='w', pady=10) self.frame_button = Frame(self.window) self.button_save = Button(text="Save", command=self.clicked) self.button_save.pack(anchor='center') self.frame_button.pack(anchor='w', pady=10) def clicked(self): name = self.entry_name.get() # 处理年龄输入异常 try: age = int(self.entry_age.get()) * 2 except ValueError: self.entry_age.delete(0, END) messagebox.showwarning("输入错误", "请输入有效的整数年龄") self.entry_age.focus() return # 处理未选择Status的情况 status = self.rbtn.get() if status == 'none': status = 'Unknown' # 写入文件 with open('data.csv', 'a') as f: f.write(f"{name},{age},{status}\n") # 清空输入框并定位光标 self.entry_name.delete(0, END) self.entry_age.delete(0, END) self.entry_name.focus() # 启动程序主入口 if __name__ == "__main__": root = Tk() root.title("User Info") app = GUI(root) root.mainloop()
各需求实现细节:
- 无效年龄输入处理:
用try-except捕获年龄转整数时的ValueError,触发异常后清空年龄输入框,弹出提示框告知错误,同时让光标聚焦在年龄框方便重新输入,最后终止后续保存流程。 - 未选择Status的处理:
获取单选框值后判断是否为初始的'none',若是则替换为'Unknown'再写入文件。 - 点击Save后光标定位:
保存完成并清空输入框后,调用self.entry_name.focus()让光标自动定位到Name输入框。
额外优化:用f-string拼接写入内容更简洁易读,补充了程序主入口代码,确保可直接运行。
内容的提问来源于stack exchange,提问作者user21083709
相关产品推荐
相关产品推荐

