如何在Tkinter中让用户下载SQL语句生成的CSV文件?
解决Tkinter中自选路径保存SQL查询结果为CSV的问题
你现在的代码问题在于先固定写入了本地的out.csv,之后才调用文件选择框,完全搞反了顺序,而且还有变量名写错的问题。下面是修正后的代码,实现点击按钮后让用户自选保存路径:
# 导入所需模块 from tkinter import * from tkinter import ttk import sqlite3 import csv from tkinter.filedialog import asksaveasfile root = Tk() root.geometry('200x150') def save(): # 先弹出文件保存选择框,让用户选路径 files = [('CSV 文件', '*.csv')] csv_file = asksaveasfile(filetypes=files, defaultextension=files, mode='w', encoding='UTF-8') # 如果用户取消选择,直接退出函数 if not csv_file: return # 连接数据库并执行查询 connection = sqlite3.connect("Products.db") product_cursor = connection.cursor() product_cursor.execute("SELECT title, price FROM products") # 写入CSV内容 csv_writer = csv.writer(csv_file, newline='') # 写入表头 csv_writer.writerow([desc[0] for desc in product_cursor.description]) # 写入查询结果 csv_writer.writerows(product_cursor) # 关闭资源 product_cursor.close() connection.close() csv_file.close() btn = ttk.Button(root, text='保存', command=save) btn.pack(side=TOP, pady=20) mainloop()
关键修改点说明:
- 调整顺序:先调用
asksaveasfile获取用户选择的文件对象,确认用户没有取消后再执行后续操作 - 修正变量名:把原代码里的
ShopeeCursor改成正确的product_cursor(统一用小写蛇形命名更规范) - 直接使用文件对象:
asksaveasfile可以指定mode='w'和encoding='UTF-8',拿到的文件对象直接给csv.writer使用,不需要再用open打开文件 - 增加取消判断:如果用户弹出选择框后点了取消,
csv_file会是None,此时直接退出函数,避免后续报错 - 关闭数据库连接:原代码漏了关闭数据库连接,这里补上确保资源释放
内容的提问来源于stack exchange,提问作者nTIAO
相关产品推荐
相关产品推荐

