You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:35:23