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

Python绘制折线图在Tkinter GUI中仅显示一半的问题求助

问题:Matplotlib折线图在Tkinter Canvas中仅显示一半,剩余区域为黑色

使用Python结合Tkinter与Matplotlib绘制折线图,数据来源于SQLite数据库,但折线图在GUI的Canvas组件中仅显示一半,剩余区域为黑色。相关代码如下:

###----------------Connecting to the database-------------##### 
import sqlite3 
DB = sqlite3.connect("personal_project.db")

CURSOR = DB.cursor()
###----------------create the SQL command to create the table and save data-------------######
COMMAND1 = """CREATE TABLE IF NOT EXISTS 
          balance (
          UserID INTEGER PRIMARY KEY,
          Date TEXT,
          Amount TEXT,
          Descriotion)"""
CURSOR.execute(COMMAND1)

from tkinter import *
from tkinter import messagebox
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

###----------------Create the window-------------#####
main_WINDOW = Tk()
main_WINDOW.title("Study App")
main_WINDOW.geometry("1940x1080")#width*length
main_WINDOW.configure(bg="#ffffff")   


###------Show Information Using Graph-------###
graquery = '''SELECT Date, Amount FROM balance'''
CURSOR.execute(graquery)
graresults = CURSOR.fetchall()
Date = [result[0] for result in graresults]
Amount = [result[1] for result in graresults]
figure = plt.figure()
plt.plot(Date, Amount)
plt.xlabel('Date')
plt.ylabel('Amount')
plt.title('Balance graph Graph')
gracanvas = Canvas(main_WINDOW, width=1070, height=452)
gracanvas.place(x=356, y=270)
figure_canvas = FigureCanvasTkAgg(figure, gracanvas)
gracanvas.create_window(0,0,window=figure_canvas.get_tk_widget(), anchor="nw") 


main_WINDOW.mainloop()

解决方案

问题出在Matplotlib画布与Tkinter Canvas的尺寸适配、渲染逻辑上,按以下方式修改即可修复:

  1. 创建Matplotlib Figure时,指定与Tkinter Canvas匹配的尺寸(按默认DPI=100换算,像素尺寸/100得到英寸尺寸)
  2. 将Matplotlib的画布组件直接填充到Tkinter Canvas中,确保尺寸完全适配
  3. 调用draw()方法完成图形的完整渲染

修改后的代码:

###----------------Connecting to the database-------------##### 
import sqlite3 
DB = sqlite3.connect("personal_project.db")

CURSOR = DB.cursor()
###----------------create the SQL command to create the table and save data-------------######
COMMAND1 = """CREATE TABLE IF NOT EXISTS 
          balance (
          UserID INTEGER PRIMARY KEY,
          Date TEXT,
          Amount TEXT,
          Descriotion)"""
CURSOR.execute(COMMAND1)

from tkinter import *
from tkinter import messagebox
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

###----------------Create the window-------------#####
main_WINDOW = Tk()
main_WINDOW.title("Study App")
main_WINDOW.geometry("1940x1080")#width*length
main_WINDOW.configure(bg="#ffffff")   


###------Show Information Using Graph-------###
graquery = '''SELECT Date, Amount FROM balance'''
CURSOR.execute(graquery)
graresults = CURSOR.fetchall()
Date = [result[0] for result in graresults]
Amount = [result[1] for result in graresults]

# 按Canvas尺寸创建对应大小的Figure
figure = plt.figure(figsize=(10.7, 4.52), dpi=100)
plt.plot(Date, Amount)
plt.xlabel('Date')
plt.ylabel('Amount')
plt.title('Balance Graph')

gracanvas = Canvas(main_WINDOW, width=1070, height=452)
gracanvas.place(x=356, y=270)

figure_canvas = FigureCanvasTkAgg(figure, gracanvas)
# 将Matplotlib画布组件填充到Tkinter Canvas中
figure_canvas.get_tk_widget().pack(fill=BOTH, expand=YES)
# 执行渲染
figure_canvas.draw()


main_WINDOW.mainloop()

额外说明:如果不想手动换算尺寸,也可以直接给figure_canvas.get_tk_widget()设置width和height属性,强制匹配Tkinter Canvas的尺寸。

内容的提问来源于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 17:35:30