2017-10-16 98 views
-1

我有一个很大的问题使用tkinter与self这里是我的代码 请人给一个答案,谢谢!我得到的错误是,像self could not be given a variable outside a functionpython调用类似变量

from tkinter import * 
root = Tk() 

class start(): 
    global self 
    self = root 

    def __init__(): 
     self.title('__init__') 
     self.geometry('300x300') 

    __init__(self) 

class window_extra(): 

    def canvas(self): 
     global self 
     selfc = Canvas(self, bg='black').pack() 

    canvas(self) 

self.mainloop() 

谢谢!

+0

是什么问题?我得到的错误与'canvas'中的'self'和'global self'有关。你可以将论点重新命名为任何你想要的,但是我真的不知道你打算做什么。你能解释你的目标吗? – ryachza

+3

你想在这里实现什么样的世界? –

+0

@ Guydangerous99'全球自我'是一个非常糟糕的主意。一个类中的'self'变量是神圣的,不应该被覆盖! – slightlynybbled

回答

3

您不应该使用self作为变量名称,因为它用于指定是否某个属性是类实例的属性。

您不需要在类中使用全局,因为在处理通过类需要的变量时,在大多数情况下使用类属性。

由你所示的代码,我认为你正在尝试做这样的判断:

from tkinter import * 

class start(): 

    def __init__(self, root): 
     self.master = root 
     self.master.title('__init__') 
     self.master.geometry('300x300') 
     Canvas(self.master, bg='black').pack() 

root = Tk() 
start(root) 
root.mainloop() 

不过我相信你与编程的面向对象方法挣扎,我建议不使用OOP来如果是这种情况,请从此开始。

也许在YouTube上找几个教程或点击Codecadamy。

在回答您的评论:

在我看来,在使用init正确是一个坏主意。我用它作为一个常规def。我不关心,如果我使用自我全局,除非函数/类变量被称为自我。

我尊重的正确使用初始化,但我只是找到,INIT和self.master整个事情我只是没有得到任何的吧!

不理解事物并不意味着说事情是坏的。使用self.master是为了提供一个绑定回Tk()变量的类属性。这允许类中的任何方法与Tk()的实例进行交互。我无法与其他编程语言交流,但使用self在python的OOP中是非常重要的。保留self用于引用对象的实例或类属性可能不是100%,但它是self的接受和已知使用,并且确实不应该更改/覆盖。

+0

我唯一遇到的问题是“你不能用自己作为变量名......”。我不认为“self”这个名字有什么特别之处,但也许这就是提问者所缺少的 - 它只是第一个(隐含的)参数,而名字本身并不重要。 – ryachza

+0

@ryachza够公平的。我已经更新了我的答案,说'不应该使用'而不是'cannot'。 –

+0

@ryachza:你是对的,除了几乎每个在这个星球上的python程序员都会认为它指的是一个对象的实例之外,没有什么特别的'self'。虽然你可以用任何你认为合适的方式使用“self”这个名字,但最好不要选择一个能够混淆大多数程序员的名字。 –

0

我重构了一些简单的内容,但我认为在进一步深入GUI路线之前,您需要更好地理解Python中的对象。我认为你的意思是这样的:

from tkinter import * 

# creates a subclass of Tk() called 'Application'; class names by convention 
# use CamelCase; best to stick with convention on this one 

class Application(tkinter.Tk): 

    # you don't have to create an explicit invocation of '__init__', it 
    # is automatically run when you instantiate your class (last line) 

    def __init__(): 
     super().__init__() # initialize the super class (the 'tkinter.Tk()') 

     self.title('__init__') # use 'self' to refer to this object - do not declare it as global! it is only valid within the object! 
     self.geometry('300x300') 

     self.my_canvas = tkinter.Canvas(self, bg='black') # save an instance of your canvas for easy reference later 
     self.my_canvas.pack() # pack as a separate step (only required if you plan to use the canvas later... or ever) 

     self.mainloop() # begin the tkinter loop 

# this 'if __name__ ...' is a good idea in most cases, allows you to import `Application` into other 
# files without actually running it unless you want to from that other file 

if __name__ == '__main__': 
    Application() # start your class 
+0

您应该指出,如果您稍后要直接更新画布对象,则仅需要在单独一行中进行打包。 –

+1

@ Mike-SMT编辑过,但很难想象一个画布创建时不想使用的情景。 – slightlynybbled

+0

但我同意它更多地使用pack(),而不是它在画布上的事实。如果你打算说在一个单独的行上使用pack,那么你应该有一些例子说明为什么在某些情况下这是必需的。 OP显然对Tkinter来说是新的,这是可以帮助他们前进的信息。 –