【问题标题】:Python: Tkinter :Dynamically Create LabelPython:Tkinter:动态创建标签
【发布时间】:2020-02-01 05:10:07
【问题描述】:

我正在尝试动态创建标签,但语法无效。你能帮我解决我所缺少的或任何替代方法吗

      crsr = cnxn.execute(query)
        row_num=2
        column_num=0
        Variable_Number=1
        for row in crsr.fetchall():

            test='Column_Label'+str(Variable_Number)+' = tk.Label(frame,text="'+row[0]+'")'



#proper Indentation availabe in code        test1='Column_Label'+str(Variable_Number)+'.grid(row='+str(row_num)+',column='+str(column_num)+')'
            eval(test+';'+test1)
    #        eval(test1)
            row_num+=1
            column_num+=1
        root.update_idletasks()

【问题讨论】:

  • 你为什么要这样做?使用execeval 执行代码几乎从来都不是正确的解决方案。您愿意接受更好的方法吗?
  • 是的,我需要一个更好的解决方案,而且我很早就想联系了。

标签: python tkinter


【解决方案1】:

您不应该使用exec。如果您想在循环中将计算名称与小部件相关联,请使用字典:

labels = {}
varnum = 0
for row in crsr.fetchall():
    name=f"label#{varnum}"
    labels[name] = tk.Label(frame, text=str(row[0]))
    labels[name].grid(row=row_num, column=column_num
    varnum += 1
    row_num+=1
    column_num+=1

如果您并不关心名称是什么,您可以将小部件存储在列表而不是字典中,然后使用整数索引(例如:labels[0]labels[1] 等)引用它们。

【讨论】:

    【解决方案2】:

    使用 exec() 代替 eval()

    eval 将评估一个表达式,而不是像你想要的那样运行它。 将 eval 视为 if 语句的参数。

    【讨论】:

    • 他们不应该使用execeval - 有更好的方法。
    猜你喜欢
    • 2013-12-07
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2022-12-22
    • 2012-05-21
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多