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
相关产品推荐
相关产品推荐

