我正在做一个更大的tkinter应用程序,因为应用程序的大小很大,所以我试图将应用程序划分为不同的类和方法,以使其更加清晰。

问题在于,因为我制作的子类是从主类继承的,所以它们的初始化函数会导致无限循环。

这是示例代码:

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()


如何更改该代码以使子类不会导致无限循环?

谢谢您的帮助

最佳答案

您的method类不应继承自main_window类。只需创建main_window的实例并将其传递到__init__method中。

顺便说一句,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()

10-02 10:40