【问题标题】:initialising ttk.Entry in dictionary在字典中初始化 ttk.Entry
【发布时间】:2018-02-24 23:31:34
【问题描述】:

基本上我有 8 个条目要在循环中创建并存储在字典中,以字符串为键:

class foo:
    entries={}
    keys=[#some keys are here, type string]
    #do other stuff
    def create_entries(self):
        for key in keys:
            entries[key]=ttk.Entry(self.frame,text='sometext')
    #other stuff going on
    def assign(self):
        f=open('file.name','r').read()
        #do some fancy slicing to get the strings for the entries
        for key in keys:
            entries[key].insert(0,string)

现在它失败了,说明“NoneType”对象没有“插入”属性。 我想这是因为我已将条目声明为空字典。 但如果我这样声明:entries={'KEY':ttk.Entry} 仍然声明没有插入“NoneType”。如果我像entries={'KEY':ttk,Entry()} 一样声明它,它会在开始时初始化一个空的顶层,但如果我来加载我的条目,它会再次告诉我,没有插入“NoneType”。

所以我现在有点迷路了.. 甚至可以将条目初始化到字典中,然后在其中插入一些文本?还是我必须坚持将每个条目作为“个体变量”?

最小工作示例: 如果我删除读取功能中的打印并取消注释插入,它会告诉我: self.entries[key].insert(0,s) AttributeError: 'NoneType' object has no attribute 'insert'

import tkinter as tk
from tkinter import ttk

f = open('testfile.test', 'w')
f.write('A=non-relevant\nB=SomeFunnyStuff\nZ=MySecretCode:9128\n')
f.close()

class foo:
    main = tk.Tk
    frame = ttk.LabelFrame
    keys = ['A','B','Z']
    entries={}
    labels={}
    def read(self):
        f = open('testfile.test','r').read()
        for key in self.keys:
            first=key+'='
            if key != 'Z':
                i = self.keys.index(key)+1
                last='\n'+self.keys[i]+'='
                s=f.split(first)[1].split(last)[0]
                print(s)#self.entries[key].insert(0,s)
            else:
                s=f.split(first)[1]
                print(s)#self.entries[key].insert(0,s)


    def _quit(self):
        self.main.quit()
        self.main.destroy()
        exit()
    def run(self):
        self.main.mainloop()
    def __init__(self):
        #init window
        self.main = tk.Tk()
        self.main.title('Test')
        self.frame = ttk.LabelFrame(self.main, text='Try it').grid(column=0,row=0)
        #init entries & labels
        c,r=0,0
        for key in self.keys:
            s = key+'='
            self.labels[key] = ttk.Label(self.frame, text=s).grid(column=c,row=r)
            c+=1
            self.entries[key] = ttk.Entry(self.frame,text=s).grid(column=c,row=r)
            r+=1
            c-=1
        self.button = ttk.Button(self.frame, text='close',command=lambda:self._quit()).grid(column=0,row=r)

        self.read()
        print(self.entries.values())

t = foo()
t.run()

【问题讨论】:

  • 如果您创建一个Minimal, Complete, and Verifiable 示例,您将获得更多更好的答案。
  • 发布的代码不会给您NoneType object has no attribute 'insert' 错误。是的,如果使用得当,可以使用字典。
  • @StephenRauch 我添加了一个最小的工作示例。
  • 这段代码对我来说没有错误。

标签: python-3.x tkinter tkinter-entry


【解决方案1】:

如果有人遇到类似问题:

根据this post,问题在于我如何初始化原始代码中的条目和发布的最小示例(不幸的是,不是在原始帖子中..): self.entries[key] = ttk.Entry(self.frame,text=s).grid(column=c,row=r)None 返回到字典中,正如 .grid() 返回 None

先初始化标签和条目,然后在单独的行中使用网格,但是效果很好:

self.entries[key] = ttk.Entry(self.frame,text=s)
self.entries[key].grid(column=c,row=r)

这为我解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2022-01-24
    • 2012-04-27
    • 2017-11-15
    相关资源
    最近更新 更多