在tkinter GUI中从SQLite取数绘图时执行慢且生成空图的问题咨询
核心问题定位
- 缩进错位导致绘图逻辑完全脱离函数作用域
Python靠缩进来划分代码块归属,你代码里的plt.plot(downx,downy,'-')和plt.show()没有缩进到graph_data函数内部,会被识别为全局顶层代码:- 程序启动时,这两行代码会在
graph_data()被调用、还没有执行SQL查询拉取数据的阶段就运行 - 此时
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
相关产品推荐
相关产品推荐

