Tkinter 画布对象

问题描述 投票:0回答:1

在我的 python 程序中,我有一个 tkinter 画布,里面有一个圆圈,我想创建更小的圆圈,但它们需要位于大圆圈内而不接触它。除了每次使用 while 循环检查碰撞之外,是否有一种简单的方法可以做到这一点。

这是我目前拥有的示例:

from tkinter import Tk,Canvas
import random as r

root=Tk()

canv=Canvas(master=root,width=80,height=80)
circ1=canv.create_oval(2,2,78,78)
canv.pack()


for x in range(6):   #Inside this for loop is where I am struggling
  x=r.randint(0,60)
  y=r.randint(0,60)
  canv.create_oval((x,y,x+20,y+20),outline="black",fill="green")

root.mainloop()

这里,代码在画布上随机创建 6 个绿色小圆圈,但我希望它们全部位于外圆内部而不接触它。理论上,它们应该都清晰可见,因为我试图重新创建的游戏策略之一就是计算数量,但这并不重要。 我希望这个编辑有帮助

python tkinter tkinter-canvas
1个回答
0
投票
from tkinter import Tk, Canvas
import random as r
import math

root = Tk()

canv = Canvas(master=root, width=80, height=80)
circ1 = canv.create_oval(2, 2, 78, 78)
canv.pack()

circle_radius = 38 
small_circle_radius = 10
for _ in range(60):
    angle = r.uniform(0, 2 * math.pi) # 2pi = 360deg
    distance = r.uniform(small_circle_radius, circle_radius - small_circle_radius)  

    x = 40 + distance * math.cos(angle)
    y = 40 + distance * math.sin(angle)

    canv.create_oval((x - small_circle_radius, y - small_circle_radius, x + small_circle_radius, y + small_circle_radius), outline="black", fill="green")

root.mainloop()
  • distance * math.cos(angle)
    给出了小圆的中心与大圆的中心在水平方向上的距离。
  • 并且,添加 40 会将这个位置移动到画布的中心。

© www.soinside.com 2019 - 2024. All rights reserved.