Tkinter按钮调用matplotlib.pyplot.plot时窗口及文本缩小如何解决
问题根因
该问题由matplotlib与Tkinter的DPI缩放规则冲突导致:matplotlib初始化时会自动读取系统高DPI缩放配置,修改进程全局的GUI缩放参数,覆盖了Tkinter原有窗口的适配逻辑,最终出现窗口、字体整体缩小的现象。
解决方案
以下提供三种可直接落地的修复方案,按需选择即可:
方案1:强制固定matplotlib DPI配置(改动最小)
在导入matplotlib pyplot后立即添加两行配置,关闭自动DPI调整,无需改动其他业务逻辑:
from tkinter import * from tkinter.font import Font from matplotlib import pyplot as plt # 新增配置,固定DPI避免自动修改全局缩放 plt.rcParams['figure.dpi'] = 96 plt.rcParams['figure.raise_window'] = False def Plot(): x = [0,1] y = [0,2] plt.plot(x,y) plt.show() root = Tk() root.geometry("100x100") root.resizable(width=False, height=False) text = Label(root, text="Testing", font=Font(size=20)) text.pack() bnt = Button(root, text="Click me", command=Plot, font=Font(size=15)) bnt.pack() root.mainloop()
方案2:提前开启Tkinter高DPI感知(Windows平台适用,修复更彻底)
在创建Tkinter根窗口前调用系统接口开启进程高DPI感知,从根源避免两个GUI框架的缩放冲突:
import ctypes from tkinter import * from tkinter.font import Font from matplotlib import pyplot as plt # 新增:开启进程高DPI感知,Windows系统下生效 ctypes.windll.shcore.SetProcessDpiAwareness(1) def Plot(): x = [0,1] y = [0,2] plt.plot(x,y) plt.show() root = Tk() root.geometry("100x100") root.resizable(width=False, height=False) text = Label(root, text="Testing", font=Font(size=20)) text.pack() bnt = Button(root, text="Click me", command=Plot, font=Font(size=15)) bnt.pack() root.mainloop()
方案3:嵌入matplotlib画布到Tkinter窗口(长期开发推荐)
如果后续需要频繁在Tkinter程序中使用绘图能力,建议直接将matplotlib画布作为Tkinter组件嵌入,完全避免pyplot独立窗口的全局参数修改问题。
内容的提问来源于stack exchange,提问作者Cat Mann
相关产品推荐
相关产品推荐

