You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter实现不可通过边缘调整大小但支持全屏功能的窗口

实现思路与代码示例

这个需求很实用,我来给你分享两种常用Python GUI库的实现方案,核心思路都是允许系统触发窗口尺寸变化,但在非全屏状态下强制锁死窗口大小,完美避开resizable(False, False)的限制:

Tkinter 方案

Tkinter里可以通过绑定<Configure>事件(窗口尺寸/位置变化时触发)来实现。我们先记录窗口的初始尺寸,每次触发事件时判断是否处于全屏状态——如果不是,就强制把窗口大小改回初始值;如果是全屏,则允许尺寸变化。

import tkinter as tk

def on_window_resize(event):
    # 检查当前是否为全屏状态
    if not root.attributes('-fullscreen'):
        # 仅当窗口尺寸偏离初始值时,强制恢复(避免初始化时的无限循环)
        if event.width != initial_width or event.height != initial_height:
            root.geometry(f"{initial_width}x{initial_height}")

root = tk.Tk()
# 设置初始窗口尺寸
initial_width = 800
initial_height = 600
root.geometry(f"{initial_width}x{initial_height}")

# 添加一个手动切换全屏的按钮(也可以直接用系统标题栏的全屏按钮)
def toggle_fullscreen():
    current_fullscreen = root.attributes('-fullscreen')
    root.attributes('-fullscreen', not current_fullscreen)

fullscreen_btn = tk.Button(root, text="切换全屏", command=toggle_fullscreen)
fullscreen_btn.pack(pady=20)

# 绑定窗口尺寸变化事件
root.bind('<Configure>', on_window_resize)

root.mainloop()

运行后你会发现:拖拽窗口边缘试图调整大小时,窗口会立刻弹回初始尺寸;但点击系统标题栏的全屏按钮(或我们添加的手动按钮),可以正常进入/退出全屏状态。

PyQt 方案

PyQt中可以通过重写resizeEvent方法来拦截窗口尺寸变化事件,逻辑和Tkinter一致:非全屏时强制恢复初始大小,全屏时允许调整。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton

class FixedSizeWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 初始化窗口尺寸
        self.initial_width = 800
        self.initial_height = 600
        self.setGeometry(100, 100, self.initial_width, self.initial_height)

        # 添加全屏切换按钮
        fullscreen_btn = QPushButton("切换全屏", self)
        fullscreen_btn.clicked.connect(self.toggle_fullscreen)
        fullscreen_btn.move(20, 20)

    def toggle_fullscreen(self):
        if self.isFullScreen():
            self.showNormal()
        else:
            self.showFullScreen()

    def resizeEvent(self, event):
        # 非全屏状态下,强制恢复初始尺寸
        if not self.isFullScreen():
            self.resize(self.initial_width, self.initial_height)
        # 调用父类的resizeEvent,保证其他逻辑正常运行
        super().resizeEvent(event)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = FixedSizeWindow()
    window.show()
    sys.exit(app.exec_())

核心逻辑总结

这种方案的本质是:没有完全禁用窗口的调整权限,而是通过监听尺寸变化事件+状态判断,只在非全屏场景下强制固定窗口大小。既保留了系统标题栏的全屏按钮功能,又彻底阻止了用户通过拖拽边缘调整窗口的行为,完全符合你的需求。

内容的提问来源于stack exchange,提问作者temp5168468685

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:47:50