【问题标题】:Python dictionary add/delete items in tkinter versus non-GUItkinter 与非 GUI 中的 Python 字典添加/删除项目
【发布时间】:2013-04-30 09:11:08
【问题描述】:

我正在尝试实现一个原始字典来查找我们在实验室中使用的首字母缩略词。字典格式为:

{'REN': 'plasma renin', 'PROP': 'procollagen III', 'IMETAB': 'intermediary metabolites, pyruvate, lactate, beta-OH-butyrate'...}

我可以在 GUI 和其他格式的字典中搜索项目,但在尝试添加/删除项目时出现错误,但只能使用 GUI 格式。 这是两个有问题的代码:

此代码有效

elif inp == 'add':
        abbr_in = input('acronym: ')
        text_in = input('expanded text: ')
        acronyms[abbr_in] = text_in
        with open('acronym_dict.py','w')as outfile:
            outfile.write(str(acronyms))
            outfile.close()

elif inp == 'delete':
         name = input("Enter acronym to delete: ").upper()
         r =dict(acronyms)

          del r[name]                 

            with open('acronym_dict.py','w')as outfile:
                outfile.write(str(r))
                outfile.close()

以及不起作用的 GUI 代码:

def add_acronym(): 
add_del_acronym.get()
add_del_acronym.upper()
abbr_in = addordel_acronym
add_expansion.get()
text_in = add_expansion
acronyms[abbr_in] = text_in
# write amended dictionary
with open('acronym_dict.py','w')as outfile:
    outfile.write(str(acronyms))
    outfile.close()
def remove_acronym():
    name = addordel_acronym.get().upper()
    name.upper()
    r =dict(acronyms)
    del r[name] 
    # write amended dictionary   
    with open('acronym_dict.py','w')as outfile:
        outfile.write(str(r))
        outfile.close()

我得到的错误是:

TypeError: get() missing 1 required positional argument: 'self'

请有人来帮助我。不明白该怎么做。 谢谢

【问题讨论】:

  • 您的示例中的缩进搞砸了,因此无法了解代码的真实性质。

标签: python python-3.x tkinter


【解决方案1】:

您给出的错误信息与 tkinter 无关。当您收到一条错误消息时:

TypeError: get() missing 1 required positional argument: 'self'

... 那么这意味着您正在调用像something.get() 这样的函数,但您已经将某些东西定义为def something(self)。因此,请跟踪哪个函数调用引发此错误以找到您的问题。我的猜测是你有一些变量,你认为是一个字典,但实际上是一个类的实例。

根据这个问题的原始版本的 cmets,您似乎错误地使用了 tkinter StringVar 类。你显然正在这样做:

variable = tkinter.StringVar

这会导致您将一个分配给variable,而不是将该类的一个实例分配给variable。该类定义了一个您正在调用的名为get 的方法,但它需要self 参数来告诉类您所指的是哪个实例。由于您没有引用实例,self 是未定义的,因此您会收到您报告的错误。

要解决您的问题,您必须创建StringVar 的实例,如下所示:

variable = tkinter.StringVar()

【讨论】:

  • 我看不到它。有什么“快速”的方法可以找到这样的错误。想不出单元测试或文档测试。有什么建议么?我应该发布整个代码吗?
  • @user1478335:“快速”的方法是查看错误的全文,它应该告诉您导致问题的行号。
  • 继续我注释掉除了 variable.get() 之外的所有内容并添加了一个 print(variable)。正如你所说,它是一个类。我收到消息 如何处理这个以获得值?
  • @user1478335:如果它正在打印<class 'tkinter.StringVar',那么它是一个而不是一个类的实例。由于在您使用StringVar 的问题中的代码中没有任何位置,我只能猜测您正在执行variable=tkinter.StringVar 之类的操作,而您应该使用variable=tkinter.StringVar()(注意尾随括号)
  • OK 问题已解决,但它突出显示了一些我不清楚的内容。对于添加/删除,我调用的是文本变量“名称”而不是“输入框的名称”。通过使用Entry的名称,问题已经解决。但是在其他部分(例如 find)中,我不得不使用 textvariable name 来建立相等性。什么时候用这两个打电话?我不确定我的问题是否清楚 - 我知道我的意思! acronym_edit =Entry(f2,textvariable=edit_acronym, style =".TEntry") 我之前使用的是 edit_acronym,但现在正在使用 acronym_edit 来解决问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多