2014-11-08 56 views
0

好的,我試圖找到Tkinter正在使用的框架,然後取其寬度和高度並調整窗口大小,以便一切都很合適,不會留下醜陋的空間。到目前爲止,我已經得到了以下...將字符串轉換爲Tkinter筆記本框架

convert = {"tab1_name", "tab1"; "tab2_name", "tab2"; "tab3_name", "tab3") ##(it goes on) 
a = mainframe.tab(mainframe.select(), "text") 
b = convert[a] 
w = b.winfo_reqwidth() 
h = b.winfo_reqheight() 
mainframe.configure(width=w, height=h) 

在筆記本每一幀的名稱是TAB1,TAB2,TAB3等,但對他們的標籤是獨一無二的,因爲它們描述的標籤會發生什麼。我希望能夠從轉換字典函數中獲取字符串並將其用作框架的名稱。我不確定這個框架是一個類還是其他的。有沒有辦法將字符串b轉換爲框架的名稱,並以某種方式在.winfo_reqheight()中使用它?我不希望有使該說的事......

if b=="tab1": 
    w = tab1.winfo_reqwidth() 
    h = tab1.winfo_reqheight() 
    mainframe.configure(width=w, height=h) 

每個幀,因爲我想這是很容易,而無需添加這麼多的代碼,添加新的幀。

謝謝

回答

2

選項1:

你可以存儲在詞典中的實際對象。因此,嘗試:

convert = {"tab1_name": tab1, "tab2_name": tab2, "tab3_name": tab3} 
a = mainframe.tab(mainframe.select(), "text") 
b = convert[a] 
w = b.winfo_reqwidth() 
h = b.winfo_reqheight() 
mainframe.configure(width=w, height=h) 

選項2: 執行字符串是可能的 'EXEC(' 在任意的字符串編碼 ')' 功能

How do I execute a string containing Python code in Python?

你可以這樣做:(在詞典或只是文本轉換什麼是)

convert = {"tab1_name": "tab1", "tab2_name": "tab2", "tab3_name": "tab3"} 
a = mainframe.tab(mainframe.select(), "text") 
b = convert[a] 

code1 = "w = %s.winfo_reqwidth()" % b 
code2 = "h = %s.winfo_reqheight()" % b 
exec(code1) # for python 2 it is: exec code1 
exec(code2) # python 3 changed the exec statement to a function  
mainframe.configure(width=w, height=h) 

要小心不要讓惡意代碼注入到exec語句,因爲Python會運行它。這通常只是一個問題,如果一個最終用戶可以輸入的東西進入功能(聽起來像你不必擔心這一點)。


btw,我認爲你的第一行是不正確的。你打開一個{但接近)。適當的詞典語法應該是:

convert = {"tab1_name": "tab1", "tab2_name": "tab2", "tab3_name": "tab3"} 

請注意冒號分隔鍵和值以及逗號之間的條目。

+0

哇,謝謝你完美的作品。在真正的代碼中,我有正確的字典,我只是試圖快速得到一個例子,而我弄糟了語法。感謝您發現錯誤。 – 007 2014-11-08 15:12:29

+0

Ya,當我發現我可以將對象,甚至是用戶創建的對象放在列表中時,我的代碼將從100行縮減到15,以實現特定功能。我喜歡它。它可以讓你在任何東西上使用for-loop! – Kory 2014-11-08 15:54:16

+0

在Python中,* everything *是一個對象。對象是你可以放在一個集合中的所有東西。 – 2014-11-09 08:00:01