无法在python中动态创建父子tkinter小部件

时间:2018-02-06 23:53:55

标签: python tkinter

我正在通过创建抵押贷款计算器来玩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?

2 个答案:

答案 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的答案是正确且可行的,但我会支持原始问题下面的评论,这些评论批评使用这种奇怪的布局。

PEP 20起

  • 美丽胜于丑陋。
  • 显式优于隐式。
  • 简单胜于复杂。
  • 可读性计数。
  • 如果难以解释实现方式,那是个坏主意。