当我在macOS上的tkinter中放置matplotlib图时,我得到了一些我不明白的行为。情节的大小似乎取决于我是否插入了外部监视器。
如果插入外部监视器(27“1440 p),则地块较小;如果仅使用内部监视器(14”3024x1964),则小区更大。
外部:
内部:
为了显示地块的大小不同,下面是在外部监视器上打开并拖到内部监视器上的GUI:
我真的不明白这里发生了什么,因为图形的大小(以英寸为单位)似乎并不对应任何东西,但是图的大小是通过更改 fig_size 参数来调节的。
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) 来限制帧更改大小。
self.frame2_fileplot.grid_propagate(False)
# get frame size parameters (update frame parameters first) self.frame2_fileplot.update() dpi = self.root.winfo_fpixels('1i')