我现在正在编写一个程序,它将根据文件的大小在 PyGame 中显示矩形。这完全基于搜索树,根是文件夹,其子树是文件夹或文件,文件是叶子,因为它们没有任何子树。我希望我的程序根据文件相对于根文件夹的大小递归地用矩形填充正方形。IE:根文件夹的大小为 151,file1 的大小为 50,因此 file1 将占据整个正方形的大约 33%。如果需要,我还需要制作水平矩形(即如果没有任何空间可以垂直做,做一个水平矩形)。该函数需要使用一个矩形,这与我的对象 Filetree 中定义的 self.rect 不同(如下所述)
所以我的程序是基于一个名为 FileTree 的对象,它有 self.rect,这是它的矩形大小(x、y 是起点,宽度、高度是它的宽度和高度)。它具有随机分配的颜色,并且具有子树。基本上我只是看不出我的程序哪里出了问题,因为当我调用该函数时,我得到了一堆比例正确的矩形,只是一个在另一个之上,所以它没有适当地间隔。我想知道我正在使用的递归公式是否有问题,因为调试它给了我多个具有相同起点的矩形,当它们应该是一个相邻的时候(即一个从另一个开始的地方开始)结束)
x, y, width, height = rect
#rect is a tuple (x, y, width, height)
if self.is_empty():
self.rect = (0, 0, 0, 0)
if self._parent_tree is None:
self.rect = rect
else:
p = self
while p._parent_tree is not None:
p = p._parent_tree
percentsize = self.data_size / p.data_size
newsize = math.floor(p.data_size * percentsize)
if p.rect[2] >= newsize + x > y + newsize and percentsize != 1:
self.rect = (x, y, width, newsize)
elif p.rect[3] >= newsize + y >= newsize + x and percentsize != 1:
self.rect = (x, y, newsize, height)
elif percentsize == 1:
self.rect = rect
else:
if newsize + width > height + newsize:
self.rect = (x, y, width, p.rect[3])
elif newsize + height >= newsize + width:
self.rect = (x, y, p.rect[2], height)
for sub in self._subtrees:
sub.update_rectangles(self.rect)