2016-08-31 1 views
2

더 큰 tkinter 응용 프로그램을 만들고 있는데 응용 프로그램의 크기가 상당히 크기 때문에 응용 프로그램을 다른 클래스와 메서드로 나누어보다 명확하게 만들려고했습니다.Python/Tkinter - 여러 클래스를 사용하면 상속 할 때 무한 루프가 발생합니다.

문제는 내가 만든 서브 클래스가 메인 클래스에서 상속되기 때문에 initiation 함수가 무한 루프를 유발한다는 것입니다.

import tkinter as tk 
import random 

class main_window(object): 

    def __init__(self): 

     self.root = tk.Tk() 

     self.cv = tk.Canvas(self.root, height = 400, width = 400) 
     self.cv.pack() 

     self.button1 = tk.Button(text="draw line", command=method().draw_line) 
     self.Solve_button_window = self.cv.create_window(5, 5, anchor=tk.NW, window=self.button1) 

     self.root.mainloop() 

class method(main_window): 

    def __init__(self): 
     super().__init__() #Sublclassing from main_window class causes an infinite loop 

     self.point1 = 0 
     self.point2 = 0 


    def draw_line(self): 

     self.point1 = random.randrange(10, 400) 
     self.point2 = random.randrange(10, 400) 

     self.cv.create_line(self.point1, self.point2) 




main_window() 

가 어떻게 서브 클래스는 무한 루프가 발생하지 않습니다이 코드를 변경할 수 있습니다 여기에

은 예제 코드이다?

답변

2

귀하의 method 클래스는 main_window 클래스에서 상속하지 말아야 도움을

감사합니다. main_window의 인스턴스를 만들고 __init__method으로 전달하면됩니다.

BTW, method은 클래스의 혼동을 일으키는 이름입니다. 또한 Python의 클래스 이름은 일반적으로 CamelCase로 작성됩니다.


다음은 수정 코드가 무엇을 의미하는지 보여줍니다.

import tkinter as tk 
import random 

class MainWindow(object): 
    def __init__(self): 
     self.root = tk.Tk() 

     self.cv = tk.Canvas(self.root, height = 400, width = 400) 
     self.cv.pack() 

     draw_stuff = DrawStuff(self) 

     self.button1 = tk.Button(text="draw line", command=draw_stuff.draw_line) 
     self.Solve_button_window = self.cv.create_window(5, 5, anchor=tk.NW, window=self.button1) 

     self.root.mainloop() 

class DrawStuff(object): 
    def __init__(self, mainwin): 
     self.mainwin = mainwin 
     self.cv = mainwin.cv 

    def draw_line(self): 
     self.point1 = (random.randrange(10, 400), random.randrange(10, 400)) 
     self.point2 = (random.randrange(10, 400), random.randrange(10, 400)) 
     self.cv.create_line(self.point1, self.point2) 

MainWindow() 
관련 문제