嗨,我是python和编程的完全新手。 目前我正在学习面向客观的编程和递归。
我将以面向对象的方法编写Sierpinski三角形。
from tkinter import *
from math import *
tk=Tk()
tk.title("Fractal")
canvas=Canvas(tk,width=512,height=600,bg="white")
canvas.pack()
class Triangle:
def __init__(self,canvas):
self.canvas=canvas
self.btn=Button(tk,text="Draw",command=self.draw)
self.btn.pack(side=LEFT)
self.label=Label(tk,text="Level")
self.label.pack()
self.level=Entry(tk,width=3,justify=CENTER)
self.level.insert(INSERT, "1")
self.level.pack()
def draw(self):
canvas.create_rectangle(0,0,512,500,fill="white")
level=int(self.level.get())
triangle_hieght+int(round(512*sqrt(3.0)/2.0))
recursion(self.canvas,level,0,triangle_height,256,0,512,triangle_height)
def recursion(canvas,level,x1,y1,x2,y2,x3,y3):
#I am having a problem with this part of the code
triangle=Triangle(canvas)
这是我到目前为止编写的代码,我在编写递归函数时遇到了问题。我想不出定义函数的方法,我需要一些帮助。
答案 0 :(得分:0)
我不记得Sierpinski三角递归,但我会像这样开始
编辑:现在它是完整的工作示例
import tkinter as tk
import math
class MainWindow(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title("Fractal")
self.canvas = tk.Canvas(self, width=512, height=600, bg="white")
self.canvas.pack()
#self.canvas.create_rectangle(0, 0, 512, 500, fill="white")
self.btn = tk.Button(self, text="Draw", command=self.draw)
self.btn.pack(side=tk.LEFT)
self.label = tk.Label(self, text="Level")
self.label.pack()
self.level = tk.Entry(self, width=3, justify=tk.CENTER)
self.level.insert(tk.INSERT, "1")
self.level.pack()
self.mainloop()
def draw(self):
# clear canvas
self.canvas.delete("all")
level = int(self.level.get())
height = int(round(512*math.sqrt(3.0)/2.0))
self.recursion(level, 0, height, 256, 0, 512, height)
def recursion(self, level, x1, y1, x2, y2, x3, y3):
print("level:", level)
if level <= 1:
#print(" draw element")
self.canvas.create_line(x1, y1, x2, y2)
self.canvas.create_line(x2, y2, x3, y3)
self.canvas.create_line(x3, y3, x1, y1)
else:
#print(" recursion")
level = level - 1
middle_x1 = (x1 + x2)/2
middle_y1 = (y1 + y2)/2
middle_x2 = (x2 + x3)/2
middle_y2 = (y2 + y3)/2
middle_x3 = (x3 + x1)/2
middle_y3 = (y3 + y1)/2
self.recursion(level, x1, y1, middle_x1, middle_y1, middle_x3, middle_y3)
self.recursion(level, middle_x1, middle_y1, x2, y2, middle_x2, middle_y2)
self.recursion(level, middle_x3, middle_y3, middle_x2, middle_y2, x3, y3)
# create and start main window
MainWindow()
编辑:小修改 - 创建带边距的小画布
#!/usr/bin/env python
import tkinter as tk
import math
class MainWindow(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title("Fractal")
self.width = 512
self.height = int(round(self.width*math.sqrt(3.0)/2.0))
self.margin = 10
self.canvas = tk.Canvas(self, width=self.width+(2*self.margin), height=self.height+(2*self.margin), bg="white")
self.canvas.pack()
self.btn = tk.Button(self, text="Draw", command=self.draw)
self.btn.pack(side=tk.LEFT)
self.label = tk.Label(self, text="Level")
self.label.pack()
self.level = tk.Entry(self, width=3, justify=tk.CENTER)
self.level.insert(tk.INSERT, "1")
self.level.pack()
self.mainloop()
def draw(self):
# clear canvas
self.canvas.delete("all")
level = int(self.level.get())
x1 = self.margin + 0
y1 = self.margin + self.height
x2 = self.margin + self.width/2
y2 = self.margin + 0
x3 = self.margin + self.width
y3 = self.margin + self.height
self.recursion(level, x1, y1, x2, y2, x3, y3)
def recursion(self, level, x1, y1, x2, y2, x3, y3):
print("level:", level)
if level <= 1:
#print(" draw element")
self.canvas.create_line(x1, y1, x2, y2)
self.canvas.create_line(x2, y2, x3, y3)
self.canvas.create_line(x3, y3, x1, y1)
else:
#print(" recursion")
level = level - 1
middle_x1 = (x1 + x2)/2
middle_y1 = (y1 + y2)/2
middle_x2 = (x2 + x3)/2
middle_y2 = (y2 + y3)/2
middle_x3 = (x3 + x1)/2
middle_y3 = (y3 + y1)/2
self.recursion(level, x1, y1, middle_x1, middle_y1, middle_x3, middle_y3)
self.recursion(level, middle_x1, middle_y1, x2, y2, middle_x2, middle_y2)
self.recursion(level, middle_x3, middle_y3, middle_x2, middle_y2, x3, y3)
# create and start main window
MainWindow()
答案 1 :(得分:0)
import tkinter as tk
import math
class MainWindow(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title("Fractal")
self.width = 512
self.height = int(round(self.width*math.sqrt(3.0)/2.0))
self.margin = 10
self.canvas = tk.Canvas(self, width=self.width+(2*self.margin), height=self.height+(2*self.margin), bg="white")
self.canvas.pack()
self.btn = tk.Button(self, text="Draw", command=self.draw)
self.btn.pack(side=tk.LEFT)
self.label = tk.Label(self, text="Level")
self.label.pack()
self.level = tk.Entry(self, width=3, justify=tk.CENTER)
self.level.insert(tk.INSERT, "1")
self.level.pack()
self.mainloop()
def draw(self):
# clear canvas
self.canvas.delete("all")
level = int(self.level.get())
x1 = self.margin + 0
y1 = self.margin + self.height
x2 = self.margin + self.width/2
y2 = self.margin + 0
x3 = self.margin + self.width
y3 = self.margin + self.height
self.recursion(level, x1, y1, x2, y2, x3, y3)
def recursion(self, level, x1, y1, x2, y2, x3, y3):
print("level:", level)
if level <= 1:
#print(" draw element")
self.canvas.create_line(x1, y1, x2, y2)
self.canvas.create_line(x2, y2, x3, y3)
self.canvas.create_line(x3, y3, x1, y1)
else:
#print(" recursion")
level = level - 1
middle_x1 = (x1 + x2)/2
middle_y1 = (y1 + y2)/2
middle_x2 = (x2 + x3)/2
middle_y2 = (y2 + y3)/2
middle_x3 = (x3 + x1)/2
middle_y3 = (y3 + y1)/2
self.recursion(level, x1, y1, middle_x1, middle_y1, middle_x3, middle_y3)
self.recursion(level, middle_x1, middle_y1, x2, y2, middle_x2, middle_y2)
self.recursion(level, middle_x3, middle_y3, middle_x2, middle_y2, x3, y3)
用于创建和启动主窗口:
MainWindow()