2014-11-08 90 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