我使用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
我现在应该怎么做,请忽略编程的基本错误,因为我是一名机械工程师,没有编程背景。而且我必须为我的能量计算器制作许多其他盒子。
答案 0 :(得分:1)
当您的变量为t_diesel_price
时,您尝试将Entry
视为list
(以及None
)。
首先,我建议你安装一些IDE(例如PyCharm)并放置断点以查看变量是否有错!
您的问题发生了,因为您在一行中创建并打包小部件!因此t_diesel_price
为None
,因为pack()
始终返回None
(link)。
只需将您的声明和包装拆分为:
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')
干杯!