Python 如何使用带平方的递归?

Python 如何使用带平方的递归?,python,class,recursion,tkinter,Python,Class,Recursion,Tkinter,我有一个问题,你怎么能用分数坐标递归地画一个矩形?我一直在尝试使正方形/矩形每次缩小10%,直到它占据整个画布(这意味着它不能超过木板的宽度和高度,或者它只是变为0意味着它不会绘制任何东西,或者它太小以至于你看不到最终的正方形)。或者,我可以用另一种方法,以递归的方式画出正方形,不断减少一定的百分比 到目前为止,我已经做到了这一点,但我似乎不知道是谁让它继续递归,直到它不能再这样做 import tkinter class draw_squares: def __init__(self

我有一个问题,你怎么能用分数坐标递归地画一个矩形?我一直在尝试使正方形/矩形每次缩小10%,直到它占据整个画布(这意味着它不能超过木板的宽度和高度,或者它只是变为0意味着它不会绘制任何东西,或者它太小以至于你看不到最终的正方形)。或者,我可以用另一种方法,以递归的方式画出正方形,不断减少一定的百分比

到目前为止,我已经做到了这一点,但我似乎不知道是谁让它继续递归,直到它不能再这样做

import tkinter

class draw_squares:
    def __init__(self, squares: [(float, float, float, float)]):
        self.squares = squares

        self.root_window = tkinter.Tk()

        self.canvas = tkinter.Canvas(master = self.root_window,
                                     width = 500, height = 500,
                                     background = 'blue')
        self.canvas.grid(row=0, column = 0, padx=0, pady = 0,
                         sticky = tkinter.E + tkinter.W + tkinter.S + tkinter.N)

        self.canvas.bind('<Configure>', self._resized)

        self.root_window.rowconfigure(0, weight = 1)
        self.root_window.columnconfigure(0, weight = 1)

    def start(self):
        self.root_window.mainloop()

    def _resized(self, event: tkinter.Event):
        self.draw_squares_recursively()

    def draw_squares_recursively(self):
        self.canvas.delete(tkinter.ALL)

        for x, y, x2, y2 in self.squares:
            if x != 0.5 and y != 0.5 and x2 != 0.5 and y2 != 0.5:
                self._draw_square(self._draw_square(x-.1,y-.1,x2+.1,y2+.1))

    def _draw_square(self, x: float, y:float, x2:float, y2:float):
        width = self.canvas.winfo_width()
        height = self.canvas.winfo_height()

        self.canvas.create_rectangle(
            x * width, y * height,
            x2 * width, y2 *height, outline = 'grey')

if __name__ == '__main__':
    squares = [(0.9, 0.9, 0.1, 0.1), (0.8,0.8,0.2,0.2), (0.7,0.7,0.3,0.3),
               (0.6,0.6,0.4,0.4), (0.5,0.5,0.5,0.5)]

    app = draw_squares(squares)
    app.start()
导入tkinter
绘制正方形的类别:
def uuuu init uuuuuuuuuuuuuuuuuuu(自身,正方形:[(浮点,浮点,浮点,浮点)]):
self.squares=squares
self.root_window=tkinter.Tk()
self.canvas=tkinter.canvas(master=self.root\u窗口,
宽度=500,高度=500,
背景='蓝色')
self.canvas.grid(行=0,列=0,padx=0,pady=0,
粘性=tkinter.E+tkinter.W+tkinter.S+tkinter.N)
self.canvas.bind(“”,self.\u已调整大小)
self.root\u window.rowconfigure(0,权重=1)
self.root\u window.columnconfigure(0,权重=1)
def启动(自):
self.root\u window.mainloop()
def_大小调整(自身,事件:tkinter.event):
self.draw_squares_递归()
def递归绘制正方形(自):
self.canvas.delete(tkinter.ALL)
对于x、y、x2、y2,在自平方中:
如果x!=0.5和y!=0.5和x2!=0.5和y2!=0.5:
自绘制正方形(自绘制正方形(x-.1,y-.1,x2+.1,y2+.1))
def_draw_square(self,x:float,y:float,x2:float,y2:float):
width=self.canvas.winfo_width()
高度=self.canvas.winfo_高度()
self.canvas.create_矩形(
x*宽度,y*高度,
x2*宽度,y2*高度,轮廓='灰色')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
平方=[(0.9,0.9,0.1,0.1),(0.8,0.8,0.2,0.2),(0.7,0.7,0.3,0.3),
(0.6,0.6,0.4,0.4), (0.5,0.5,0.5,0.5)]
app=绘制正方形(正方形)
app.start()

非常感谢您的帮助

首先,您使用的是浮点数,因此(not)equal不是一个好主意。draw_squares_递归()可以调用自己,直到达到限制为止。你可以计算出你想要的尺寸和位置

class DrawSquares:
    def __init__(self, square):
##        self.squares = squares

        self.root_window = tkinter.Tk()

        self.canvas = tkinter.Canvas(master = self.root_window,
                                 width = 500, height = 500,
                                 background = 'blue')
        self.canvas.grid(row=0, column = 0, padx=0, pady = 0,
                     sticky = "nsew")

##        self.canvas.bind('<Configure>', self._resized)

        self.root_window.rowconfigure(0, weight = 1)
        self.root_window.columnconfigure(0, weight = 1)

        self.draw_squares_recursively(square)
        self.root_window.mainloop()


    def draw_squares_recursively(self, square):
        ##self.canvas.delete(tkinter.ALL)

        for value in square:
            if value < 0.05 or value > 100:
                return

        self.canvas.create_rectangle(square[0], square[1],
                                     square[2], square[3],
                                     outline = 'grey', width=2)
        square[2] += 20
        square[3] += 20
        self.draw_squares_recursively(square)

if __name__ == '__main__':
    squares = [0.9, 0.9, 10.1, 10.1]
    app = DrawSquares(squares)
类绘图方块:
def uuu init uuuu(自身,方形):
##self.squares=squares
self.root_window=tkinter.Tk()
self.canvas=tkinter.canvas(master=self.root\u窗口,
宽度=500,高度=500,
背景='蓝色')
self.canvas.grid(行=0,列=0,padx=0,pady=0,
sticky=“nsew”)
##self.canvas.bind(“”,self.\u已调整大小)
self.root\u window.rowconfigure(0,权重=1)
self.root\u window.columnconfigure(0,权重=1)
自。递归绘制正方形(正方形)
self.root\u window.mainloop()
def递归绘制正方形(自、正方形):
##self.canvas.delete(tkinter.ALL)
对于以平方表示的值:
如果值<0.05或值>100:
返回
self.canvas.create_矩形(正方形[0],正方形[1],
正方形[2],正方形[3],
轮廓='灰色',宽度=2)
平方[2]+=20
平方[3]+=20
自。递归绘制正方形(正方形)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
平方=[0.9,0.9,10.1,10.1]
app=绘图方块(方块)

非常感谢您的回复,但我确实有几个问题要问?为什么不在类中使用start def?另外,我对平方[2]或平方[3]+=20的作用有点困惑,希望您能详细说明。还有,如果我可以将正方形居中,那么它将开始像“[[]]]”一样绘制,而不是从侧面开始绘制正方形。所以一个正方形的内部有一个比它小10%的正方形,而另一个正方形的内部有一个比它小10%的正方形?另外,如果我想用电路板调整正方形的大小呢?很抱歉问了这么多问题。我只是想了解一下发生了什么。关于python的教程和列表谢谢,我知道了!我感谢你的帮助:)