我正在通过创建一个抵押计算器来玩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,', {}]
]
当我运行这段代码时,没有创建第一个小部件(标签框架)。但是,当我在循环外部创建标签框架时,如下所示:
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()
这个程序运行得很好。如何将标签框包括在循环中?
发布于 2020-12-17 16:14:16
对于任何发现这个问题的人来说,从内容中可以看出,我当时对编程非常陌生。在我的记忆中,我有一种天真的印象,认为以一种非常抽象的方式组织代码可以节省处理时间,或者更容易阅读。我没有掌握控制计算机操作的基本机制。考虑到这一点,akarilimano的回答是正确和有效的,但我支持在最初的问题下面的评论,它批评使用这样一个奇怪的布局。
来自PEP 20
发布于 2018-02-07 05:03:45
您使用'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)
https://stackoverflow.com/questions/48653833
复制