python – 使用TCL扩展在Tkinter中设置本机窗口样式

pythonware.com/library/tkinter/introduction/…
documents a overrideredirect method
that will remove thetitlebar and
borders, if that is not enough you
must set the native window style, I’m
not sure if Tkinter gives you that
kind of low-level access, if not, try
the something like
twapi.magicsplat.com/ui.html#set_window_style
TCL extension

在之前的帖子中,我得到了关于如何在Tkinter获得边框的回复,类似于下图所示.我不熟悉Tcl及其扩展.那怎么会这样呢?最终目标基本上是在Tkinter窗口下方获取边框.

alt text http://i30.tinypic.com/69jm2a.png

编辑:

我在Windows 7上使用了以下内容,它似乎没有改变风格.它可能遗漏了一些东西.任何帮助将不胜感激,这可能真的很酷!

import string, win32ui, win32con
import Tkinter as tk

root = tk.Tk()

frame = win32ui.CreateWindowFromHandle(string.atoi(root.wm_frame(), 0))
frame.ModifyStyle(win32con.WS_CAPTION, 0, win32con.SWP_FRAMECHANGED)

root.mainloop()
最佳答案
您可以使用Python win32 api包和Tkinter的组合来完成此操作.您需要知道的是,Tk窗口是Win32窗口的客户端部分.使用包装器处理窗口管理器交互,该包装器是Tk窗口本身的父包.如果你有一个Tkinter窗口’w’,那么你可以为框架创建一个PyWin32窗口或直接操作它.您可以使用w.wm_frame()获取帧hwnd并解析返回的十六进制字符串,或者使用来自Tk窗口的winfo_id值的GetParent(尽管wm_frame可能更可靠).

import string, win32ui, win32con
from Tkinter import *
w = Tk()
frame = win32ui.CreateWindowFromHandle(string.atoi(w.wm_frame(), 0))
frame.ModifyStyle(win32con.WS_CAPTION, 0, win32con.SWP_FRAMECHANGED)

这将删除WS_CAPTION样式并通知窗口其框架已被修改,这会强制进行几何体重新计算,以便更改传播到Tk子窗口.

编辑—
以下内容安排确保在完全创建窗口并将窗口映射到显示后修改窗口样式.

import string, win32ui, win32con
from Tkinter import *

def decaption(event):
    w = event.widget
    frame = win32ui.CreateWindowFromHandle(string.atoi(w.wm_frame(), 0))
    frame.ModifyStyle(win32con.WS_CAPTION, 0, win32con.SWP_FRAMECHANGED)
    w.bind("<Map>", None)

root = Tk()
root.bind("<Map>", decaption)
root.mainloop()

转载注明原文:python – 使用TCL扩展在Tkinter中设置本机窗口样式 - 代码日志