在Windows中禁用窗口大小调整
我一直在使用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这个消息,然后用你想要的大小来覆盖新的大小。