首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tkinter中matplotlib图的大小取决于主监视器

tkinter中matplotlib图的大小取决于主监视器
EN

Stack Overflow用户
提问于 2022-04-19 05:33:39
回答 1查看 134关注 0票数 0

当我在macOS上的tkinter中放置matplotlib图时,我得到了一些我不明白的行为。情节的大小似乎取决于我是否插入了外部监视器。

如果插入外部监视器(27“1440 p),则地块较小;如果仅使用内部监视器(14”3024x1964),则小区更大。

外部:

内部:

为了显示地块的大小不同,下面是在外部监视器上打开并拖到内部监视器上的GUI:

我真的不明白这里发生了什么,因为图形的大小(以英寸为单位)似乎并不对应任何东西,但是图的大小是通过更改fig_size参数来调节的。

我希望有一些方法来保持情节的大小与GUI的其他部分保持一致。请注意,绘图的大小与“小部件”标签有关。

用于生成屏幕截图的最小工作示例:

代码语言:javascript
运行
复制
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方法是否会改变任何事情,所以我想保持这种一致性。

EN

回答 1

Stack Overflow用户

发布于 2022-04-20 05:40:41

我没有改变我的帧大小,但是为了将我的情节保持在框架内,我得到了相对于那个和帧大小的dpi和设置的图形大小,然后用这个图填充这个框架。我还通过设置self.frame2_fileplot.grid_propagate(False)来限制帧更改大小。

代码语言:javascript
运行
复制
# 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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71920115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档