在Windows中禁用窗口大小调整

4 投票
2 回答
1231 浏览
提问于 2025-04-17 00:01

我一直在使用Windows的API调用,想让一些原生的Windows窗口样式在Tkinter中正常工作。但是,当我尝试让窗口不能被调整大小时,遇到了一些问题。在窗口显示之前使用 root.resizable(False, False),效果和 root.overrideredirect(True) 方法有点像;而在样式改变后再调用它,就会导致窗口出现各种奇怪的情况(窗口会乱掉)。我在想,可能有一个Windows特有的方法可以替代 root.resizable(False, False)。我该怎么做才能让它正常工作呢?请记住,我手里有Tkinter窗口的句柄。

代码:

import Tkinter as tk
import string, win32ui, win32con

def decaption(event):
    root = event.widget

    # makes a handle to the window
    handle = string.atoi(root.wm_frame(), 0)

    # changes the style
    frame = win32ui.CreateWindowFromHandle(handle)
    frame.ModifyStyle(win32con.WS_CAPTION, 0, win32con.SWP_FRAMECHANGED)

    root.bind("<Map>", None)

root = tk.Tk()

# changes the style when the window is mapped
root.bind("<Map>", decaption)

root.mainloop()

2 个回答

3

这里有几个建议:

  • 你可以试着去掉 WS_THICKFRAME 这个样式:

    frame.ModifyStyle(win32con.WS_THICKFRAME, 0)
    
  • 另一个方法是处理 WM_GETMINMAXINFO 消息,这个消息会返回窗口的最小和最大宽度和高度。在你的情况下,你可以返回当前的宽度和高度。你可以通过 GetWindowRect 来获取这些信息。

2

我对Python的角度没什么了解,不过还有一种方法可以让窗口不能被调整大小(除了改变它的样式)就是处理WM_WINDOWPOSCHANGING这个消息,然后用你想要的大小来覆盖新的大小。

撰写回答