我正在通过创建抵押贷款计算器来玩tkinter。我试图从一个单独的文件动态创建小部件,该文件包含具有相关属性的列表。
主要文件是:
import tkinter as tk
import tkinter.ttk as ttk
import tkinterwidgetinfo as twi
root=tk.Tk()
root.title('Tkinter Practice')
class Application(ttk.Frame):
def __init__(self, master=None):
super().__init__()
self.pack()
self.createApplication()
def createApplication(self):
## create widgets dynamically from twi
for i in twi.progWidgets:
a = i[1]+i[2]+'**'+str(i[3])+')'
i[0] = eval(a)
i[0].pack()
app = Application(root)
app.mainloop()
包含窗口小部件信息的列表位于单独的文件中并已导入。信息如下:
progWidgets = [
['inputFrame', 'ttk.LabelFrame(', '', {'text': "User Input",
'labelanchor': "nw"}],
['principalLabel', 'ttk.Label(', 'inputFrame,', {'text' : "Principal(£)"}],
['principalEntry', 'ttk.Entry(', 'inputFrame,', {}],
['termLabel', 'ttk.Label(', 'inputFrame,', {'text' : "Mortgage Term (Years)"}],
['termEntry', 'ttk.Entry(', 'inputFrame,', {}]
]
当我运行此代码时,不会创建第一个小部件(labelframe)。但是,当我在循环外创建labelframe时,如下所示:
import tkinter as tk
import tkinter.ttk as ttk
import tkinterwidgetinfo as twi
root=tk.Tk()
root.title('Tkinter Practice')
class Application(ttk.Frame):
def __init__(self, master=None):
super().__init__()
self.pack()
self.createApplication()
def createApplication(self):
inputFrame = ttk.Labelframe(text = "User Input",
labelanchor = "nw")
inputFrame.pack()
## create widgets dynamically from twi
for i in twi.progWidgets:
a = i[1]+i[2]+'**'+str(i[3])+')'
i[0] = eval(a)
i[0].pack()
app = Application(root)
app.mainloop()
该程序表现完美。如何在循环中包含labelframe?
答案 0 :(得分:0)
您使用'inputFrame'
作为父名称,但未定义。运行第二段代码时inputFrame
已定义,一切正常。
我同意评论者使用eval
这是一个糟糕的想法(安全原因,灵活性),但你仍然可以这样做:
for i in twi.progWidgets:
a = i[0]+'='+i[1]+i[2]+'**'+str(i[3])+')'
eval(a)
a = i[0]+'.pack()'
eval(a)
答案 1 :(得分:0)
对于任何发现此问题的人,从内容中可以看出,我当时对编程还很陌生。从我的记忆中,我天真的印象是,以非常抽象的方式组织代码可以节省处理时间或更易于阅读。我没有掌握决定计算机运行的基本机制。考虑到这一点,akarikilimano的答案是正确且可行的,但我会支持原始问题下面的评论,这些评论批评使用这种奇怪的布局。