在 tkinter 图形画布上调整绘图大小的问题

6

在运行OS 11.6.1的Mac上使用Python 3.9。我的应用程序涉及在根窗口内的帧上放置一个图表,我正在努力使图表占据窗口的较大部分。我认为matplotlib.pyplot中的rcParams会处理这个问题,但我一定是忽略了什么。

以下是我目前的进展:

import numpy as np
from tkinter import Tk,Frame,TOP,BOTH

import matplotlib
from matplotlib import pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

plt.rcParams["figure.figsize"] = [18,10]

root=Tk()
root.wm_title("Root Window")
root.geometry('1500x1000')

x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)
fig, ax = plt.subplots()
ax.plot(x, y)

canvas_frame=Frame(root) # also tried adjusting size of frame but that didn't help
canvas_frame.pack(side=TOP,expand=True)
canvas = FigureCanvasTkAgg(fig, master=canvas_frame)
canvas.draw()
canvas.get_tk_widget().pack(side=TOP,fill=BOTH,expand=True)


root.mainloop()

对于我的实际应用,我需要canvas具有一个框架作为其父级而不是简单的root,这就是为什么引入canvas_frame的原因。


有没有类似于canvas.pack的.center或其他替代方法? - Christopher Hoffman
3
这个问题并不是与正确添加画布到窗口有多大关系,而是要把画布里面的额外空间去掉。如果在创建画布后添加一行代码将其填充为红色,然后快速调整窗口大小,图形会闪烁,并且你可以看到红色背景。红色填满整个窗口,所以画布正在尽可能地填充整个窗口。改变添加画布到窗口的方式不会有太大作用,只是排除一些可能性。 - Sylvester Kruin
2
要用特定颜色填充画布,您可以使用 bg="red"。要自行测试,请在调用 root.mainloop() 之前添加 canvas.get_tk_widget().config(bg="red")。然后,取消最大化窗口并快速来回拖动其中一侧。如果您的计算机足够慢(像我的),您应该能够看到红色闪烁填充窗口。 - Sylvester Kruin
1
是的,我有 - 请参见上面1/5 20:23的回复。这只是将情节移动到我的窗口左上方。 - fishbacp
2
你介意附上一张屏幕截图,展示你看到的效果及你期望看到的改进吗? - mdurant
显示剩余7条评论
2个回答

4

尝试像这样做:

fig.subplots_adjust(left=0.05, bottom=0.07, right=0.95, top=0.95, wspace=0, hspace=0)

这是输出,现在图形占据了更多的屏幕区域% [figure now takes more screen realestate1


非常感谢您的解决方案。您可能会对我在stackoverflow.com/questions/70598913/...发布的类似问题(带有图像)感兴趣。主要区别在于绘图是动画,并且它被嵌入到Toplevel而不是Frame中。 - fishbacp

1
除了改变边距的建议外,您还可以将fill=BOTH添加到画布小部件中。
canvas_frame.pack(side=TOP,expand=True,fill=BOTH)

这会使图形画布占用更多的空间,但绘图不会占据整个窗口。然而,如果我调整窗口大小,则绘图将占据整个窗口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接