Tkinter主窗口点击PLOT按钮后缩小,如何固定窗口尺寸?
解决Tkinter主窗口点击按钮后缩小的问题
问题原因
你当前使用了matplotlib的pyplot全局接口(比如plt.figure()、plt.gcf()),这些全局操作会干扰Tkinter主窗口的布局状态,导致主窗口尺寸被意外修改,哪怕已经设置了root.resizable(False, False)。
解决方案
改用matplotlib的面向对象API创建绘图对象,完全避免使用pyplot的全局函数,同时确保主窗口的布局逻辑稳定。
修改后的完整代码
import tkinter as tk from matplotlib.figure import Figure from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import numpy as np def plot_sine_wave(): x = np.linspace(0, 2 * np.pi, 100) y = np.sin(x + np.random.uniform(-0.5, 0.5)) plot_window = tk.Toplevel(root) plot_window.title("Random Sine Wave Plot") # 用面向对象方式创建绘图对象,不依赖plt全局接口 fig = Figure(figsize=(6, 4), dpi=100) ax = fig.add_subplot(111) ax.plot(x, y) ax.set_xlabel("x") ax.set_ylabel("y") ax.set_title("Random Sine Wave") ax.grid(True) # 将绘图画布添加到新窗口 canvas = FigureCanvasTkAgg(fig, master=plot_window) canvas.draw() canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) # 主窗口设置 root = tk.Tk() root.title("Sine Wave Plot") root.geometry("200x100") root.resizable(False, False) plot_button = tk.Button(root, text="PLOT", command=plot_sine_wave) plot_button.pack(pady=20) root.mainloop()
关键修改点
- 移除
import matplotlib.pyplot as plt,改用from matplotlib.figure import Figure直接创建独立的Figure实例 - 用
fig = Figure(...)和ax = fig.add_subplot(111)替代plt.figure()等全局绘图操作 - 绘图时使用
ax.set_xlabel()、ax.set_title()等面向对象方法,而非plt.xlabel()这类全局方法 - 给画布的
pack()方法添加fill=tk.BOTH, expand=True,让绘图窗口的画布能自适应窗口大小
这样修改后,主窗口的尺寸会完全固定,点击PLOT按钮只会弹出新的绘图窗口,不会影响原主窗口的大小。
内容的提问来源于stack exchange,提问作者KawaiKx
相关产品推荐
相关产品推荐

