2013-03-10 81 views
0

有沒有辦法知道什麼是Tk部件的「類型」?尋找一個Tk部件的類型

舉一個例子,假設我使用tk::label命令或ttk::label命令創建標籤。

之後,我只有部件的路徑名稱,例如.l。現在,我想知道用於構建.l的命令是什麼。

我需要的是一個綱領性的解決方案,一些代碼,鑑於.l路徑可以返回命令的名字,我很感興趣的Tcl解決方案,或C.

編碼甚至Tcl擴展一種方法可能是重命名所有小部件創建命令,並將proc保存在某個地方,然後執行原始命令將執行的操作,但此解決方案要求您知道所有可用的小部件創建命令,不要考慮用戶定義的小部件(或整體的巨型小部件)。

非常感謝您的幫助。

回答

3

winfo class命令會告訴你的類小部件,它通常是不夠好(見本交互式會話):

% label .tklabel;  puts [winfo class .tklabel] 
Label 
% ttk::label .ttklabel; puts [winfo class .ttklabel] 
TLabel 

注意,你可以在設置類標準Tk的toplevels和TTK小部件創作時間。這可能使事情變得相當複雜。使用頂級功能,您可以看到[winfo toplevel $w] eq $w是否爲真,但從8.5開始這不是一個保證測試,因爲它可以作爲另一個窗口小部件的子窗體重新定義或者將經典窗體變爲頂級窗體(通過wm forget/wm manage)。

如果獲得用於創建插件的確切的命令,才真正確定方法是陷阱創建命令和日誌信息,像這樣:

rename frame the_real_frame 
proc frame {pathName args} { 
    set ::creationInfo($pathName) [list frame $args] 
    the_real_frame $pathName {*}$args 
} 

通常更容易儘量避免這種複雜性(特別是在生產環境中,您還需要設置事件來處理事件,以便清理關於不再存在的小部件的信息,這隻會增加更多的技巧)。

+1

不,沒有完美的解決方案。在這類事情發生之後,大多數人都試圖進行GUI序列化,而從應用程序的角度而不是工具箱的角度來看,這更好地在更高層次上完成。 Tk內部使用了相當多的小部件,你可能不想攔截。 – 2013-03-10 17:32:25

+0

謝謝Donal,像往常一樣精確:)但是,不,我沒有遵循GUI序列化路徑。我只是在考慮使用Tcl/Tk的大型GUI編程,以及處理這種複雜性的方法。 – 2013-03-10 18:41:34

+0

@Marco好的,我們並不完全符合你的要求。大部分情況下,我懷疑圍繞小部件包裝類然後記住這個級別的事情會更容易。例如,你記得你彈出一個特定消息的窗口,而不是這個對話框是如何構建或佈局的。 – 2013-03-11 10:07:04