如何让Python Tkinter中ScrolledText内容实现f-string变量替换?
实现用户输入邮件模板的变量替换
1. 初始化ScrolledText的模板内容
把st.insert(INSERT, "...")里的...替换成带占位符的邮件模板,占位符要和你的DataFrame列名完全匹配:
st.insert(INSERT, """Hi {First Name} Please find the attached report for {Vendor}. Thanks, xxxxxx xxxxxxxx yuyyyyyyy zzzzzz """)
这里的{First Name}、{Vendor}对应DataFrame里的列名,和row['First Name']、row['Vendor']一一对应。
2. 修改邮件内容的替换逻辑
直接用st.get(1.0, END)拿到的是静态字符串,没法像f-string那样自动解析变量,我们可以用str.format_map()结合pandas Series的字典转换来实现替换:
把标记(1)的代码改成下面这样:
# 获取用户输入的模板,strip()去掉多余的首尾空白 email_template = st.get(1.0, END).strip() # 将row转为字典,用format_map替换所有占位符 mail.Body = email_template.format_map(row.to_dict())
额外优化:处理模板错误
如果用户输入的模板里有拼写错误的占位符(比如写成{FirstNames}),可以加个异常捕获提示:
try: mail.Body = email_template.format_map(row.to_dict()) except KeyError as e: messagebox.showerror('模板错误', f'找不到变量: {e}') return
修改后的完整代码片段
st = ScrolledText(window) # 设置初始邮件模板 st.insert(INSERT, """Hi {First Name} Please find the attached report for {Vendor}. Thanks, xxxxxx xxxxxxxx yuyyyyyyy zzzzzz """) st.grid(row=6, column=1, columnspan=2, pady=5, padx=20, ipadx=50) def SendEmail(): try: email_info = pd.read_excel(email_file_path) outlook = win32.Dispatch('outlook.application') # 获取用户输入的模板内容 email_template = st.get(1.0, END).strip() for index, row in email_info.iterrows(): mail = outlook.CreateItem(0) mail.To = row["Email"] mail.CC = row["CC"] mail.Subject = f"OOReport for: {row['Vendor']}" # 替换模板变量 try: mail.Body = email_template.format_map(row.to_dict()) except KeyError as e: messagebox.showerror('模板错误', f'模板中存在未定义的变量: {e}') return # 取消下面注释即可发送邮件 # mail.Send() except Exception as e: messagebox.showerror('Python Error', str(e))
内容的提问来源于stack exchange,提问作者TrungT
相关产品推荐
相关产品推荐

