Python绘制折线图在Tkinter Canvas仅显示局部的技术求助
问题原因及修复方案
核心问题分析
- Matplotlib图形未适配Canvas尺寸:创建
plt.figure()时未指定与Canvas匹配的大小,图形默认尺寸过小;且未对FigureCanvasTkAgg的组件做布局调整,导致无法填充Canvas空间。 - 冗余布局指令冲突:同时使用
pack()和place()布局Canvas,引发布局逻辑混乱。 - 数据类型不兼容:数据库中
Amount字段为TEXT类型,直接作为数值绘图会导致异常(需转换为数值类型)。
修复后的完整代码
import sqlite3 from tkinter import * import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg # 连接数据库并初始化表 DB = sqlite3.connect("personal_project.db") CURSOR = DB.cursor() COMMAND1 = """CREATE TABLE IF NOT EXISTS balance ( UserID INTEGER PRIMARY KEY, Date TEXT, Amount TEXT, Description TEXT)""" # 修复字段名拼写错误:Descriotion -> Description CURSOR.execute(COMMAND1) DB.commit() # 新增提交操作,确保表创建生效 # 创建主窗口 main_WINDOW = Tk() main_WINDOW.title("Study App") main_WINDOW.geometry("1940x1080") main_WINDOW.configure(bg="#ffffff") # 从数据库获取数据并处理类型 graquery = '''SELECT Date, Amount FROM balance''' CURSOR.execute(graquery) graresults = CURSOR.fetchall() Date = [result[0] for result in graresults] # 将Amount字符串转为数值,兼容异常情况 Amount = [] for result in graresults: try: Amount.append(float(result[1])) except (ValueError, TypeError): Amount.append(0) # 非数字/空值默认设为0 # 创建匹配Canvas尺寸的Matplotlib图形 figure = plt.figure(figsize=(10.7, 4.52), dpi=100) # 10.7=1070/100,4.52=452/100,与Canvas像素对应 plt.plot(Date, Amount) plt.xlabel('Date') plt.ylabel('Amount') plt.title('Balance Graph') plt.xticks(rotation=45) # 旋转日期标签,避免重叠 # 创建Canvas并布局 gracanvas = Canvas(main_WINDOW, width=1070, height=452) gracanvas.place(x=356, y=270) # 仅保留place布局,移除冗余的pack() # 嵌入Matplotlib画布并适配空间 figure_canvas = FigureCanvasTkAgg(figure, gracanvas) canvas_widget = figure_canvas.get_tk_widget() canvas_widget.pack(fill=BOTH, expand=True) # 让组件自动填充Canvas main_WINDOW.mainloop() # 关闭数据库连接 DB.close()
关键修复点说明
- 图形尺寸匹配:通过
figsize设置与Canvas像素对应的英寸尺寸(dpi=100时,1英寸=100像素),确保图形初始大小适配Canvas。 - 布局优化:移除冗余的
pack()指令,对Matplotlib的Tk组件使用pack(fill=BOTH, expand=True),使其自动填充Canvas空间。 - 数据类型转换:将读取的
Amount字符串转为浮点型,解决数值绘图的类型冲突。 - 细节修正:修复数据库字段拼写错误,添加数据库连接关闭操作,新增日期标签旋转避免重叠。
内容的提问来源于stack exchange,提问作者alfih
相关产品推荐
相关产品推荐

