首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无法在python中动态创建父-子tkinter小部件。

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

Stack Overflow用户
提问于 2018-02-06 23:53:54
回答 2查看 212关注 0票数 1

我正在通过创建一个抵押计算器来玩tkinter。我正在尝试从一个包含具有相关属性的列表的单独文件动态创建小部件。

主要文件是:

代码语言:javascript
代码运行次数:0
运行
复制
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()

包含小部件信息的列表位于一个单独的文件中并导入。资料如下:

代码语言:javascript
代码运行次数:0
运行
复制
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,', {}]
    ]

当我运行这段代码时,没有创建第一个小部件(标签框架)。但是,当我在循环外部创建标签框架时,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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()

这个程序运行得很好。如何将标签框包括在循环中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-18 00:14:16

对于任何发现这个问题的人来说,从内容中可以看出,我当时对编程非常陌生。在我的记忆中,我有一种天真的印象,认为以一种非常抽象的方式组织代码可以节省处理时间,或者更容易阅读。我没有掌握控制计算机操作的基本机制。考虑到这一点,akarilimano的回答是正确和有效的,但我支持在最初的问题下面的评论,它批评使用这样一个奇怪的布局。

来自PEP 20

  • 美丽胜于丑陋。
  • 外显好于内隐。
  • 简单胜于复杂。
  • 可读性很重要。
  • 如果实现很难解释,那是个坏主意。
票数 0
EN

Stack Overflow用户

发布于 2018-02-07 13:03:45

您使用'inputFrame'作为父名,但没有定义它。当您运行第二段代码时,定义了inputFrame,并且一切正常工作。

我同意评论者的观点,即使用eval是一个糟糕的想法(安全原因、灵活性),但您仍然可以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
for i in twi.progWidgets:
    a = i[0]+'='+i[1]+i[2]+'**'+str(i[3])+')'
    eval(a)
    a = i[0]+'.pack()'
    eval(a)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48653833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档