You need to enable JavaScript to run this app. 在tkinter GUI中从SQLite取数绘图时执行慢且生成空图的问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

在tkinter GUI中从SQLite取数绘图时执行慢且生成空图的问题咨询

核心问题定位
  • 缩进错位导致绘图逻辑完全脱离函数作用域
    Python靠缩进来划分代码块归属,你代码里的plt.plot(downx,downy,'-')和plt.show()没有缩进到graph_data函数内部,会被识别为全局顶层代码:
    1. 程序启动时,这两行代码会在graph_data()被调用、还没有执行SQL查询拉取数据的阶段就运行
    2. 此时downx、downy是graph_data函数内部的局部变量,全局作用域根本无法读取到这两个值,哪怕你之前在全局初始化了空的downx、downy列表,绘图代码拿到的也是未填充数据的空列表,最终渲染出空白图表
  • 双重GUI事件循环冲突导致程序耗时久、运行卡顿
    你同时启动了Tkinter的主循环(window.mainloop())和Matplotlib原生独立窗口的事件循环(plt.show()),两套GUI系统会抢占系统资源,出现程序假死、响应延迟的问题。你代码里注释了FigureCanvasTkAgg的导入,说明本来计划把图表嵌入Tkinter窗口,但实际没实现嵌入逻辑,反而用了Matplotlib独立弹窗的模式,从根源上违背了开发目标。
  • 数据库连接生命周期管理缺失
    全局创建的数据库连接、游标没有和绘图逻辑形成闭环,查询、数据组装、绘图的流程完全断裂,没有按照正确的执行顺序运行。此外代码中导入的pandas模块未被实际使用,属于冗余导入。
修正后的可运行参考代码
import tkinter as tk
import sqlite3
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

# 初始化Tk主窗口
window = tk.Tk()
window.title("SQLite数据绘图程序")

def graph_data():
    # 每次绘图时临时创建数据库连接,避免长期占用资源
    conn = sqlite3.connect('Testdb.db')
    cursor = conn.cursor()
    cursor.execute('SELECT Geardx, Geardy FROM Table1')
    rows = cursor.fetchall()
    # 用完及时关闭连接
    conn.close()

    # 组装绘图数据
    downx = [row[0] for row in rows]
    downy = [row[1] for row in rows]

    # 将Matplotlib画布嵌入Tk窗口,不弹出独立的Matplotlib窗口
    fig = plt.figure(figsize=(6, 4), dpi=100)
    ax = fig.add_subplot(111)
    ax.plot(downx, downy, '-')
    canvas = FigureCanvasTkAgg(fig, master=window)
    canvas.draw()
    canvas.get_tk_widget().pack()

# 执行绘图逻辑
graph_data()
window.mainloop()

内容的提问来源于stack exchange,提问作者Simon-S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 19:45:03