【问题标题】:TypeError in __init__(), unexpected argument python__init__() 中的 TypeError,意外参数 python
【发布时间】:2016-03-06 13:58:21
【问题描述】:

我有以下代码:

from tkinter import *

class Button:   
    def __init__(self, master):
        frame = Frame( master )
        frame.pack()

        self.printButton = Button(frame, text = "Print Message", command=self.printMessage)
        self.printButton.pack(side = LEFT)

        self.quitButton = Button(frame, text = "Quit", command = frame.quit)
        self.quitButton.pack(side = LEFT)

    def printMessage(self):
        print(" WORKING!! " )       



root = Tk()
b = Button(root)
root.mainloop()

这似乎并没有错……但是当我运行它时,终端说:

Traceback (most recent call last):
File "class.py", line 23, in <module>
b = Button(root)
File "class.py", line 10, in __init__
self.printButton = Button(frame, text = "Print Message", command=self.printMessage)
TypeError: __init__() got an unexpected keyword argument 'command'

我根据 tkinter 教程编写了所有这些代码。在本教程中,代码运行良好。任何帮助,将不胜感激。提前致谢!

【问题讨论】:

  • 您只是在创建自己的Button 类的另一个实例。尝试将其重命名为CustomButton
  • 很多 Tkinter 示例代码使用from tkinter import *,但您现在已经发现为什么这是一个的想法了。
  • @PM2Ring ,每当我像你提到的那样学习一些基础知识时,我的生活就更有意义了:P。非常感谢您的建议!
  • 我的荣幸! FWIW,当您执行 from tkinter import * 时,您导入了 170 多个名称(在 Python 2 中,我不确定 Python 3 中的确切数字)。这不仅令人讨厌,因为可能与您定义自己的名称发生冲突,而且还有一个更大的问题。想象一下,如果您随后对另一个大模块执行 import * 会发生什么。新模块中的名称可能会破坏 Tkinter 模块中的名称,这将导致奇怪的错误。希望代码将无法运行,提供有用的错误消息。但它有可能运行,只是没有按照你的预期运行。
  • @PM2RING 这听起来像是在执行一个秘密组合来创建一个邪恶的人工智能:P。我再也不会使用“import *”了……或者,你不觉得值得一试吗??哦,好吧,没关系,太科幻了:)。

标签: python class tkinter init


【解决方案1】:

Tkinter 已经有一个 Buttonclass,当你创建你的类时,你现在已经覆盖了名为 Button 的 tkinter 类。因此,当您尝试创建这样的 tkinter 按钮时:

self.printButton = Button(frame, text = "Print Message", command=self.printMessage)

您现在正在引用 您的 按钮,因为您之前覆盖了 tkinter 按钮。而且由于你的按钮只接受一个参数,而你给它三个参数,它会给你一个错误。解决此问题的方法是将您的导入行更改为:

import tkinter as tk

然后使用tk.* 引用任何 tkinter 函数。例如:

root = Tk()

会变成:

root = tk.Tk()

然后您的按钮将被 Button 引用,而 tkinter 按钮将被 tk.Button 引用。这样您就可以轻松区分两者。但是,您也可以将您的按钮称为 myButton 之类的名称,这也可以解决问题。

【讨论】:

  • "你现在有两个名为Button的类"。我明白你的意思,但这并不完全正确,因为你不能在同一范围内拥有两个具有相同名称的事物。
  • 是的,我明白你的意思。你会怎么说呢?
  • 可能是这样的:“同一范围内的两个不同事物不能具有相同的名称,因此当您创建 Button 类时,它会替换之前由 Tkinter 定义的 Button 类”。也许可以举一个例子来说明简单的变量,例如a='one'; a=1
  • 非常感谢大家!这是一个非常明确的答案。
猜你喜欢
  • 2019-01-13
  • 2016-04-15
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 2020-10-22
  • 2021-11-17
  • 2016-11-01
相关资源
最近更新 更多