2010-07-22 68 views
4

pythonware.com/library/tkinter/introduction/... 記錄了overrideredirect方法 ,將刪除thetitlebar和 邊界,如果這還不夠,你必須 設置本機窗口樣式,我 不知道的Tkinter爲您提供了 那種低級別的訪問,如果沒有,請嘗試 的像 twapi.magicsplat.com/ui.html#set_window_style TCL擴展使用TCL擴展設置本機窗口樣式在Tkinter的

在之前的文章中,我將這個作爲回覆,告知如何在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() 

回答

4

您可以使用Python win32 api包和Tkinter的組合來完成此操作。你需要知道的是,Tk窗口是Win32窗口的客戶端部分。窗口管理器交互使用Tk窗口本身的父類的包裝來處理。如果你有一個Tkinter窗口'w',那麼你可以爲該框架創建一個PyWin32窗口或直接操作它。您可以使用w.wm_frame()獲取幀hwnd,並解析返回的十六進制字符串,或者使用GetParent對來自Tk窗口的winfo_id值(儘管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() 
+0

請參閱編輯。這可能很棒。 – rectangletangle 2011-08-18 00:13:43

+1

它可能只需要重新計算幾何圖形 - 您是否嘗試調整窗口大小並查看標題是否會在重繪時突然消失?如果是這樣,那麼添加'w.geometry(w.geometry())'足​​以重新確定Tk的大小和位置,並使其重新計算所有內容。 – patthoyts 2011-08-18 21:19:09

+0

是的,我試着添加(上面的代碼)** root.geometry(root.geometry())**,** root.update_idletasks()**和** root.configure(width = 225,height = 124)**。以及手動更改窗口幾何圖形(抓住角落並移動它)。他們似乎都沒有刪除標題。是否有可能強制窗口重繪在win32api的一面?也可能導致問題的是我調用了** root.mainloop()**方法,以便可以啓動GUI事件循環。 – rectangletangle 2011-08-18 23:59:07

2

一個解決方案是繪製自己的邊框。使用overrideredirect刪除所有裝飾,網格/包/放置一個填充窗口的畫布,然後繪製或使用位圖來獲得所需的視覺效果。您必須添加自己的綁定來移動和調整窗口大小,但這並不難。