我使用tkinter与self
有一个大问题,这是我的代码
请人们回答,谢谢!我得到的错误类似于self could not be given a variable outside a function
。
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 :(得分: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编程方法,如果是这种情况,我建议不要使用OOP开始。
也许在youtube上学习一些教程或者打开Codecadamy。
回应你的意见:
在我的意见中使用init是一个坏主意。我用它作为常规def。如果我使用self global,我无所谓,除非函数/类变量被称为self。
我尊重正确使用 init ,但我只是找到了所有内容, init 和self.master我只是没有得到它!
缺乏对事物的理解并不意味着所说的事情是坏的。 self.master
的使用是为了提供一个与Th()根变量相关联的类属性。这允许类中的任何方法与Tk()的实例交互。我无法与其他编程语言对话,但self
的使用在Python的OOP中非常重要。保留self
以引用对象的实例或类属性可能不是100%,但它是self
的已接受和已知用法,并且实际上不应该被更改/覆盖。
答案 1 :(得分: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