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()
我正在做一个更大的 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()