Python/Tkinter - 使用多个 类,继承时会导致死循环

Python/Tkinter - Using multiple classes, causes infinite loop when inheriting

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

问题是因为我做的子class是从主class继承的,它们的启动函数导致死循环。

这是一个示例代码:

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

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

感谢您的帮助

您的 method class 不应继承自 main_window class。只需创建一个 main_window 的实例并将其传递到 method__init__

顺便说一句,method 是一个容易混淆的 class 名称。此外,Python 中的 class 名称通常以 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()