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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:10:23