用Tkinter/Tcl设置窗口样式:没有退出按钮

3 投票
2 回答
5265 浏览
提问于 2025-04-16 17:29

我知道Tkinter其实是建立在Tcl/Tk之上的一个简单界面。用Tkinter可以做一些事情来改变窗口的样式。比如说,使用root.attributes('-toolwindow', True)这段代码,就可以把窗口的样式改成工具窗口的样子。不过,我想深入一点,看看更底层的东西。

我猜在某个时候,Tcl/Tk会参考Windows的窗口样式。我觉得它必须这样做,才能设置窗口的样式,进而影响Tkinter窗口的样式。我想给Tkinter窗口设置一个我认为是WS_DLGFRAME的样式,但我不太确定该怎么做。

我想知道在Tkinter的Tcl/Tk部分,在哪里可以设置窗口样式,以及我需要添加什么才能实现这个样式。

我的最终目标是让Tkinter窗口的边框样式看起来像下面这个(注意它没有关闭按钮):

enter image description here

顺便说一下,这是在Windows 7上。

2 个回答

5

下面这个选项是告诉窗口管理器不要给窗口加装饰,也就是说窗口上不会有标题栏和按钮,也没有边框。

root.overrideredirect(True)

如果把这个选项设置为假,就会恢复这些装饰。

3

如果你对C语言有点了解,可以去下载Tk的源代码

我简单看了一下,在这个文件里:./win/tkWinWm.c,第3072行(在tk859-src.zip里),你会找到一个叫static int WmAttributesCmd()的函数,它处理你提到的-toolwindow,后面会被UpdateWrapper()更新。

所以,要想改变这个功能,没什么简单的方法,除非你修改Tk的源代码。

另外,你也可以试试用FindWindow来查找Tk的窗口类,那个类名是TK_WIN_CHILD_CLASS_NAME,定义为TkChild,然后用SetWindowLongPtr( GWLP_STYLE, ...)来改变窗口样式(不过这需要一些调用C语言的技巧或者其他方法)。

我自己对Tcl/Tk也不太熟悉,所以你可以参考一下。为什么不去问问Tcl/Tk的社区呢?

撰写回答