【问题标题】:How to use recursion with square?如何使用平方递归?
【发布时间】:2016-03-13 04:58:12
【问题描述】:

我有一个问题,如何使用分数坐标递归绘制矩形?我一直试图让正方形/矩形每次变小 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()

非常感谢您的帮助!

【问题讨论】:

    标签: python class recursion tkinter


    【解决方案1】:

    首先,您使用的是浮点数,因此(不)等于不是一个好主意http://www.lahey.com/float.htmdraw_squares_recursively() 可以调用自身直到达到限制。您可以算出算术以获得所需的大小和位置。

    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)
    

    【讨论】:

    • 非常感谢您的回复,但我确实有几个问题要问?为什么在课堂上没有开始定义?另外,我对 square[2] 或 square[3] += 20 的作用有点困惑,希望您能详细说明一下。另外,我将如何在可以使正方形居中的地方做到这一点,而不是从侧面开始正方形,它只会开始像 "[ [ [ [ [ ] ] ] ]" 一样开始绘制。所以一个正方形里面有一个比它小 10% 的正方形,而那个正方形里面有另一个比它小 10% 的正方形?另外,如果我希望方块随板调整大小怎么办?抱歉所有问题。
    • 我只是想了解发生了什么。
    • 谢谢我知道了!感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2019-12-25
    • 2017-08-02
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多