【发布时间】:2020-09-09 04:41:24
【问题描述】:
我正在 tkinter 画布中创建一个游戏,其中涉及生成文本(1 位或 2 位数字),我已经让它工作,但我不知道如何显示它们,以免它们重叠。目前我有这个:
import tkinter as tk
from tkinter import font
import random
BOX_SIZE = 300
class Game(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.config(bg = "white")
self.numBox = tk.Canvas(self, height = BOX_SIZE, width = BOX_SIZE , bg = "white", highlightthickness = 0)
self.numBox.pack(expand = True)
self.score = 0
self.numberSpawn()
def placeNumber(self, value):
validSpawn = False
attempts = 0
maxAttempt = False
while not validSpawn and not maxAttempt:
attempts += 1
if attempts > 20:
maxAttempt = True
attempts = 0
size = random.choice([24,36,48,72])
coord = [random.randint(40,BOX_SIZE - 40) for x in range(2)]
self.numBox.update()
pxSize = tk.font.Font(size = size, family = "Times New Roman").measure(value)
if len(str(value)) == 1:
secondCoords = [coord[0] + pxSize *2.5 , coord[1] + pxSize]
else:
secondCoords = [x + pxSize for x in coord]
if not self.numBox.find_overlapping(*coord, *secondCoords):
validSpawn = True
if not maxAttempt:
newTxt = self.numBox.create_text(*coord, font = ("Times New Roman",size), text = value)
def numberSpawn(self):
self.maxNum = random.randint(3,19)
self.placeNumber(self.maxNum)
for i in range(random.randint(4, 16)):
num = random.randint(0, self.maxNum-1)
self.placeNumber(num)
app = Game()
app.mainloop()
value 是要显示的数字,BOX_SIZE 是画布的尺寸。我尝试使用this 来阻止文本重叠,并尝试使用this 在创建文本之前找到文本的像素大小。尽管如此,文本仍然像这样重叠:
我不知道如何解决这个问题,或者为什么它不能按原样工作。任何帮助表示赞赏。
【问题讨论】:
-
您总是创建一个新的文本项,即使您已达到最大尝试次数。允许超过 5 次尝试可能会有所帮助。
-
你做了什么来调试这个?您是否已验证
pxSize是您的瘦身套件应有的样子?find_overlapping是否返回您认为应该返回的内容?coord是否设置为您认为的设置? -
我测试过的 @BryanOakley pxSize 似乎是正确的。我不确定 find_overlapping 是否返回了正确的东西,我只是从问题中提到的另一个答案中得到它。 Coord 设置为画布内的随机坐标。我看不出哪里出了问题。
-
@jasonharper 我不知道我是否理解正确,但我刚刚尝试在创建文本之前添加
if not maxAttempt,因此只有在有效位置为找到了,但这似乎不能解决问题 -
请edit您的问题包含完整的minimal reproducible example。
标签: python tkinter tkinter-canvas