【问题标题】:Changing entry text in tkinter, if the entry is created from list如果条目是从列表中创建的,则更改 tkinter 中的条目文本
【发布时间】:2017-03-30 06:24:28
【问题描述】:

我使用默认值为N/A 的for 循环创建了12 个输入框。通过.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

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

【问题讨论】:

    标签: python user-interface tkinter


    【解决方案1】:

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

    出现您的问题是因为您在一行中创建并打包了您的小部件!所以t_diesel_priceNone 因为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')
    

    干杯!

    【讨论】:

      猜你喜欢
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2022-09-23
      相关资源
      最近更新 更多