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的尺寸适配、渲染逻辑上,按以下方式修改即可修复:
- 创建Matplotlib Figure时,指定与Tkinter Canvas匹配的尺寸(按默认DPI=100换算,像素尺寸/100得到英寸尺寸)
- 将Matplotlib的画布组件直接填充到Tkinter Canvas中,确保尺寸完全适配
- 调用
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
相关产品推荐
相关产品推荐

