2016-03-06 59 views
2

我有以下代码:类型错误在__init __(),意外的说法蟒蛇

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教程编写了所有这些代码。在教程中,代码运行良好。任何帮助,将不胜感激。提前致谢!

+1

你只是创建你自己的'Button'类的另一个实例。尝试将其重命名为“CustomButton”。 – zondo

+2

许多Tkinter示例代码使用'from tkinter import *',但是您现在已经发现这是一个**糟糕的主意。 –

+0

@ PM2Ring,每当我学习一些你提到的基础知识时,我的生活就会变得更有意义:P。非常感谢您的建议! –

回答

4

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

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

您现在引用按钮,因为您以前已改写了Tkinter的按钮。而且由于你的按钮只需要一个参数而你给它三个,它会给你一个错误。解决这个问题的办法是到你的导入线改成这样:

import tkinter as tk 

,然后引用任何Tkinter的功能与tk.*。例如:

root = Tk() 

将成为:

root = tk.Tk() 

然后你的按钮将由Button引用而Tkinter的按钮将被tk.Button引用。这样你可以很容易地在这两者之间切入。不过,你也可以打电话给你的按钮,如myButton这也可以解决问题。

+0

“你现在有两个类名为'Button'”。我明白你的意思,但这不完全正确,因为你不能在同一个范围内有两个同名的东西。 –

+0

是的,我明白你的意思了。你会怎么说呢? – MarkyPython

+1

也许是这样的:“在同一个作用域中的两个不同的事物不能有相同的名称,所以当你创建你的Button类时,它会替换之前由Tkinter定义的Button类。也许给一个例子用简单的变量说明同样的事情,例如'a ='one'; a = 1' –