Python tkinter在面向客观的方法中编码sierpinski三角形

时间:2015-11-28 10:54:53

标签: python class recursion tkinter

嗨,我是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)

这是我到目前为止编写的代码,我在编写递归函数时遇到了问题。我想不出定义函数的方法,我需要一些帮助。

2 个答案:

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

enter image description here

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