如果从列表创建条目,则更改tkinter中的条目文本

时间:2017-03-30 06:24:28

标签: python user-interface tkinter

我使用for循环创建了12个Entry框,默认值为N/A。通过.trace方法检测条目文本的任何更改。

我想使用重置按钮将条目框上的所有文字都恢复为N/A

from tkinter import *

root = Tk()


t_diesel_price_EnF_variable = ["JanVar", "FebVar", "MarVar", "AprVar","MayVar","JuneVar","JulyVar","AugVar","SeptVar", "OctVar", "NovVar", "DecVar"]
t_diesel_price_EnF_values = ["N/A", "N/A","N/A", "N/A","N/A", "N/A","N/A", "N/A","N/A", "N/A","N/A", "N/A"]

def EnFChanging(*events):
    for EnF in range(0,len(t_diesel_price_EnF_variable)):
        t_diesel_price_EnF_values[EnF]=t_diesel_price_EnF_variable[EnF].get()
        try:
            t_diesel_price_EnF_values[EnF] = float(t_diesel_price_EnF_values[EnF])
        except ValueError:
            pass
    print(t_diesel_price_EnF_values)


for EnF in range(0,len(t_diesel_price_EnF_values)):
    t_diesel_price_EnF_variable[EnF] = StringVar(root , value = "N/A")
    t_diesel_price = Entry(root , textvariable =  t_diesel_price_EnF_variable[EnF], width = 10).pack()
    t_diesel_price_EnF_variable[EnF].trace("w",EnFChanging)


def ChangeText():
    for EnF in range(0, len(t_diesel_price_EnF_values)):
        t_diesel_price[EnF].delete(0,END)
        t_diesel_price[EnF].insert(0,"N/A")

    return

b1 = Button(root, text = "Reset" , command = ChangeText).pack()


root.mainloop()

当我按下按钮时,它会出现错误t_diesel_price[EnF].delete(0,END) TypeError: 'NoneType' object is not subscriptable

我现在应该怎么做,请忽略编程的基本错误,因为我是一名机械工程师,没有编程背景。而且我必须为我的能量计算器制作许多其他盒子。

1 个答案:

答案 0 :(得分:1)

当您的变量为t_diesel_price时,您尝试将Entry视为list(以及None)。 首先,我建议你安装一些IDE(例如PyCharm)并放置断点以查看变量是否有错!

您的问题发生了,因为您在一行中创建并打包小部件!因此t_diesel_priceNone,因为pack()始终返回Nonelink)。 只需将您的声明和包装拆分为:

t_diesel_price = Entry(root , textvariable =  t_diesel_price_EnF_variable[EnF], width = 10)
t_diesel_price.pack()

之后它适用于我,除了t_diesel_price是最后创建的条目并且值仅在其中更改的事实。所以我假设您需要另一个列表来迭代条目:

...
# another fresh list
t_diesel_price_EnF_entries = list()    
...
    # declare entry
    t_diesel_price = Entry(root, textvariable=t_diesel_price_EnF_variable[EnF], width=10) 
    # pack entry    
    t_diesel_price.pack()                                                                       
    # append entry to list
    t_diesel_price_EnF_entries.append(t_diesel_price)                                           
...
def ChangeText():
    # iterate over entries
    for diesel_price in t_diesel_price_EnF_entries:
        diesel_price.delete(0,END)
        diesel_price.insert(0,"N/A")
...

如果您根本不想存储条目,则可以迭代StringVar

def ChangeText():
    # iterate over stringvars
    for EnF in range(len(t_diesel_price_EnF_variable)):
        t_diesel_price_EnF_variable[EnF].set('N/A')

并且您可以使其更具可读性,例如使用条目迭代:

def ChangeText():
    # iterate over stringvars
    for string_var in t_diesel_price_EnF_variable:
        string_var.set('N/A')

干杯!