当我在macOS上的tkinter中放置matplotlib图时,我得到了一些我不明白的行为。情节的大小似乎取决于我是否插入了外部监视器。
如果插入外部监视器(27“1440 p),则地块较小;如果仅使用内部监视器(14”3024x1964),则小区更大。
外部:
内部:
为了显示地块的大小不同,下面是在外部监视器上打开并拖到内部监视器上的GUI:
我真的不明白这里发生了什么,因为图形的大小(以英寸为单位)似乎并不对应任何东西,但是图的大小是通过更改fig_size
参数来调节的。
我希望有一些方法来保持情节的大小与GUI的其他部分保持一致。请注意,绘图的大小与“小部件”标签有关。
用于生成屏幕截图的最小工作示例:
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
from tkinter import ttk
import tkinter as tk
class Application(tk.Frame, object):
def __init__(self, master=None):
# Call baseclass constructor.
super(Application, self).__init__(master)
self.fig_size = (6.5, 4)
self.dpi = 100
self.notebook = ttk.Notebook(root)
self.notebook.pack(pady=10, expand=True)
## Buid window with tabs ##
width = 600
height = 400
self.main = tk.Frame(self.notebook, width=width, height=height)
self.main.pack(fill='both', expand=True)
self.notebook.add(self.main, text='TAB 1')
ttk.Style().map("TNotebook.Tab", foreground=[("selected", "#000000")])
self.initialise_main(self.main)
def initialise_main(self, tab):
lbl = tk.Label(tab, text='WIDGET')
self.fig, self.ax = plt.subplots(
1, 1,
figsize=self.fig_size,
dpi=self.dpi,
)
self.line, = self.ax.plot([], []) # empty graph
self.ax.clear()
self.GUIFig = FigureCanvasTkAgg(self.fig, tab)
self.ax.ticklabel_format(useOffset=False)
lbl.grid(row = 0, column=0)
self.GUIFig.get_tk_widget().grid(row=1, column=0)
if __name__ == '__main__':
root = tk.Tk()
app = Application()
app.master.title('MRE')
app.mainloop()
注意:这个例子可能不是完全模仿的,但我不确定OOP方法是否会改变任何事情,所以我想保持这种一致性。
发布于 2022-04-20 05:40:41
我没有改变我的帧大小,但是为了将我的情节保持在框架内,我得到了相对于那个和帧大小的dpi和设置的图形大小,然后用这个图填充这个框架。我还通过设置self.frame2_fileplot.grid_propagate(False)
来限制帧更改大小。
# get frame size parameters (update frame parameters first)
self.frame2_fileplot.update()
dpi = self.root.winfo_fpixels('1i')
plotwidth = self.frame2_fileplot.winfo_width() / dpi
plotheight = self.frame2_fileplot.winfo_height() / dpi
# create plot
self.plot_figure_fileplot_main = Figure(figsize = (plotwidth, plotheight),
dpi = dpi, frameon = False, tight_layout = True)
https://stackoverflow.com/questions/71920115
复制相似问题