链接: tkinter如何在Windows系统上正确自定义窗口 - 知乎
说实话, 看到这个文章的时候我真的太激动, 太高兴了, 也让我知道了一个事情就是有问题的时候一定要多个平台找找
2023/6/12:
如何将置顶的小白条去掉
如果你是从上面链接中出来的, 你会发现其中所展现的窗口最顶上依旧会有一个难看的无法更改的小白条, 这个时候只要在 style 加上 & ~win32con.WS_THICKFRAME
(代码是链接中的, 在这里我直接加上去了)
from tkinter import Tk
from win32gui import GetParent, SetWindowPos, UpdateWindow, SetWindowLong, GetWindowLong, ReleaseCapture, SendMessage
from win32con import NULL, SWP_NOSIZE, SWP_NOMOVE, SWP_NOZORDER, SWP_DRAWFRAME, GWL_STYLE, WS_CAPTION, WM_SYSCOMMAND, SC_MOVE, HTCAPTION, WS_THICKFRAME
root = Tk()
def titlebar(window):
hWnd = GetParent(window.winfo_id())
SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~WS_CAPTION & ~WS_THICKFRAME)
SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_DRAWFRAME)
UpdateWindow(hWnd)
def windowMove(widget, window):
def move():
ReleaseCapture()
SendMessage(GetParent(window.winfo_id()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0)
widget.bind("<B1-Motion>", lambda event: move())
windowMove(root, root)
root.after(100, lambda: titlebar(root))
root.mainloop()
结果你会发现那个最上面的小白条就没有了
在使用过程中发现使用geometry的时候出现窗口卡顿:
将原先的 geometry 方法改为 ( window 是窗口):
hwnd = win32gui.GetParent(window.winfo_id())
win32gui.SetWindowPos(hwnd, win32con.HWND_TOP, x, y, 0, 0, win32con.SWP_NOSIZE | win32con.SWP_NOZORDER)
最后我想说tkinter库最大的一个问题解决了, 这也就意味着tkinter不光有着高自由度, 还有着很好的语法结构, tkinter真的好用!