我试图根据用户输入的深度在python tkinter上绘制递归树,这是我到目前为止的代码:
from tkinter import * # Import tkinter
import math
#angleFactor = math.pi/5
#sizeFactor = 0.58
class Main:
def __init__(self):
window = Tk() # Create a window
window.title("Recursive Tree") # Set a title
self.width = 200
self.height = 200
self.canvas = Canvas(window,
width = self.width, height = self.height,bg="white")
self.canvas.pack()
# Add a label, an entry, and a button to frame1
frame1 = Frame(window) # Create and add a frame to window
frame1.pack()
Label(frame1,
text = "Enter the depth: ").pack(side = LEFT)
self.depth = StringVar()
entry = Entry(frame1, textvariable = self.depth,
justify = RIGHT).pack(side = LEFT)
Button(frame1, text = "Display Recursive Tree",
command = self.display).pack(side = LEFT)
self.angleFactor = math.pi/5
self.sizeFactor = 0.58
window.mainloop() # Create an event loop
def drawLine(self, x1,x2,y1,y2):
self.canvas.create_line(x1,y1,x2,y2, tags = "line")
def display(self):
self.canvas.delete("line")
return self.paintBranch(int(self.depth.get()),self.width/2, self.height /2 , self.height/3, math.pi/2)
def paintBranch(self,depth, x1, y1, length, angle):
if depth >= 0:
x2 = x1 +int( math.cos(angle) * length)
y2 = y1 + int(math.sin(angle) * length)
# Draw the line
self.drawLine(x1,y1,x2,y2)
# Draw the left branch
self.paintBranch(depth - 1, x2, y2, length * self.sizeFactor, angle + self.angleFactor )
# Draw the right branch
self.paintBranch(depth - 1, x2, y2, length * self.sizeFactor, angle - self.angleFactor )
Main()
当用户输入depth=0
代码正在运行时,但在depth >=1
递归时,代码无法绘制树,我需要帮助我的代码,谢谢之前
答案 0 :(得分:2)
你的主要问题是你把args弄乱了drawLine
方法。您将其定义为
drawLine(self, x1,x2,y1,y2)
但你称之为
self.drawLine(x1,y1,x2,y2)
因此,您传递的y1
arg将用于x2
参数,而x2
arg将用于y1
参数。
您还需要更改初始y1
值,并在从y2
计算y1
时更改符号,因为当您在屏幕上移动时,Tkinter中的Y坐标会增加。 / p>
这是修复后的代码版本。
from tkinter import * # Import tkinter
import math
class Main:
def __init__(self):
window = Tk() # Create a window
window.title("Recursive Tree") # Set a title
self.width = 400
self.height = 400
self.canvas = Canvas(window,
width = self.width, height = self.height,bg="white")
self.canvas.pack()
# Add a label, an entry, and a button to frame1
frame1 = Frame(window) # Create and add a frame to window
frame1.pack()
Label(frame1,
text = "Enter the depth: ").pack(side = LEFT)
self.depth = StringVar()
Entry(frame1, textvariable = self.depth,
justify = RIGHT).pack(side = LEFT)
Button(frame1, text = "Display Recursive Tree",
command = self.display).pack(side = LEFT)
self.angleFactor = math.pi/5
self.sizeFactor = 0.58
window.mainloop() # Create an event loop
def drawLine(self, x1,y1, x2,y2):
self.canvas.create_line(x1,y1, x2,y2, tags = "line")
def display(self):
self.canvas.delete("line")
depth = int(self.depth.get())
return self.paintBranch(depth, self.width/2, self.height, self.height/3, math.pi/2)
def paintBranch(self, depth, x1, y1, length, angle):
if depth >= 0:
depth -= 1
x2 = x1 + int(math.cos(angle) * length)
y2 = y1 - int(math.sin(angle) * length)
# Draw the line
self.drawLine(x1,y1, x2,y2)
# Draw the left branch
self.paintBranch(depth, x2, y2, length * self.sizeFactor, angle + self.angleFactor )
# Draw the right branch
self.paintBranch(depth, x2, y2, length * self.sizeFactor, angle - self.angleFactor )
Main()