2017-10-16 3 views
-1

나는 큰 문제가있다. self와 함께 tkinter를 사용한다. 내 코드는 사람들이 답을 주어도 될까? 고마워! 내가 얻는 오류는 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

무엇이 문제입니까? 내가 얻는 오류는 '캔버스'의 'self'와 'global self'와 관련이 있습니다. 인수의 이름을 원하는대로 바꿀 수는 있지만, 실제로 무엇을하려는 의도인지는 알 수 없습니다. 당신의 목표를 설명 할 수 있습니까? – ryachza

+3

세계에서 당신은 여기서 무엇을하려고합니까? –

+0

@ Guydangerous99'global self'는 * 정말로 * 나쁜 생각입니다. 클래스 내의'self' 변수는 신성하며 겹쳐서는 안됩니다! – slightlynybbled

답변

3

자기가 변수 이름으로 사용해서는 안되는 이유는 무엇인가가 클래스 인스턴스의 속성인지 여부를 지정하는 데 사용되기 때문입니다.

클래스를 통해 필요한 변수를 처리 할 때 대부분 클래스 속성이 사용되므로 클래스에서 전역 변수를 사용할 필요가 없습니다. 내가 당신을 믿지 그러나

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 방법을 고민하고 I가 OOP를 사용하지 제안 : 당신이 보여 코드 당신이 이런 일을하려고 생각으로 판단

이 경우에 시작하십시오.

YouTube에서 몇 가지 자습서를 듣거나 Codecadamy를 클릭하십시오. 귀하의 의견에

응답에서

:

내 의견으로는 제대로 초기화 사용하는 것은 좋은 생각이다. 나는 그것을 정규 표현으로 사용한다. 함수/클래스 변수가 self가 아니라면 self global을 사용하더라도 상관 없습니다.

나는 초기화하기 의 적절한 사용을 존중하지만 난 그냥 단지 중 하나를하지 않는 초기화와 self.master와 전체를 찾아라!

일이 부족하다는 것을 의미하지는 않습니다. self.master을 사용하면 루트 Tk() 변수와 연결된 클래스 속성을 제공 할 수 있습니다. 이렇게하면 클래스 내의 모든 메소드가 Tk()의 ​​인스턴스와 상호 작용할 수 있습니다. 나는 다른 프로그래밍 언어를 말할 수는 없지만 self의 사용은 Python을위한 OOP에서 매우 중요하다. 객체의 인스턴스 또는 클래스 속성을 참조하기 위해 self을 예약하는 데 100 %를 요구하지는 않지만 실제로는 self의 허용되고 알려진 용도이므로 변경/덮어 쓰지 않아야합니다.

+0

"나는 변수 이름으로 자기를 사용할 수 없습니다 ..."라는 문제가있는 부분 만 있습니다. 나는 'self'라는 이름에 특별한 것이 없다고 생각하지만, 그것은 정확히 묻는 사람이 누락 된 것일 수도 있습니다. 그것은 단지 최초의 (암묵적인) 인수 일 뿐이며 이름 자체는 중요하지 않습니다. – ryachza

+0

@ryachza 공평합니다.나는'cannot' 대신에'should should use'라고 대답하도록 업데이트했습니다. –

+0

@ryachza : 당신은 맞습니다. 행성의 거의 모든 파이썬 프로그래머가 객체의 인스턴스를 참조한다고 가정한다는 점을 제외하면'self'에 특별한 것은 없습니다. 'self'라는 이름을 어떤 식 으로든 사용할 수는 있지만 대부분의 프로그래머를 혼란스럽게하는 이름을 선택하지 않는 것이 가장 좋습니다. –

0

약간의 단순화를 위해 재구성되었지만, GUI 경로를 너무 많이 진행하기 전에 파이썬에서 객체를 더 잘 이해할 필요가 있다고 생각합니다. 나는 당신이 다음과 같은 것을 의미한다고 생각합니다 :

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()의 ​​사용에 대해 더 동의하고 사실은 캔버스에 없다는 것에 동의합니다. 당신이 별도의 라인에서 팩을 사용한다고 말할 예정이라면 어떤 상황에서 이것이 필요한 이유에 대한 몇 가지 예가 있어야합니다. OP는 Tkinter에 새로 추가 된 정보이며, 앞으로 나아갈 때 도움이되는 정보입니다. –

관련 문제