gpt4 book ai didi

python-3.x - Python 3 Tkinter Canvas

转载 作者:行者123 更新时间:2023-12-02 14:47:40 25 4
gpt4 key购买 nike

我正在尝试画一个可以工作的时钟。我使用的是 600x600 的表格。我不知道如何将椭圆形放在表格的中心,或者如何在椭圆形内添加分钟或秒刻度线。我尝试了 dash 但无法让它看起来正确。有什么建议。提前致谢。

这是我到目前为止所做的:

from tkinter import *

canvas_width = 600
canvas_height = 600

master = Tk()

w = Canvas(master, width = canvas_width, height = canvas_height)

w.pack()

oval = w.create_oval(75,75,500,500)
minline = w.create_line(150,150,300,300)

mainloop()

最佳答案

绘制形状的中心是绘制时指定的两点的中间。目前,形状的中点(从 75, 75 绘制到 500, 500)是 237.5,因此,如果您希望它的中间点是如果您的页面,并保留 75, 75 坐标,则您必须使另一个 525, 525 完全镜像第一个页面。

至于绘制形状,您需要在 python 中进行一些数学,因此我首先建议将图像作为时钟的背景,以便绘制更少的对象。但是,如果您必须在没有其他图像的情况下执行此操作,则必须首先导入数学库。

 import math

现在,一个数学原理:半径为r的圆上的任意点都可以表示为点(r*cosθ), (r*sinθ),其中 θ 是从中心到该点的角度。这很重要的原因是您希望钟面一侧的每条线都指向中心圈子的。为此,我们需要两个点在朝向中心的共同点上画一条线,幸运的是,这意味着线上的两个点位于不同的圆上(我们的圆和其中的一个),但位于同一位置与中心的角度。

由于我们希望圆周上有 12 个小时点,每个点之间有 4 个分钟点(因此总共 60 个点),并且圆周为 360 度(因此每 6 度 1 个点),因此我们需要一个 for循环经过那个。

for angle in range(0, 360, 6):

然后我们需要 3 个常量:一个用于外圆的半径(用于开始的点),一个用于内圆(用于添加的分钟点),一个用于更内部的圆圆圈(表示结束的小时点)。我们还希望它每 30 度选择一次更内部的半径(因为它每 5 个点出现一次,并且它们之间有 6 度)。

    radius_out = 225
radius_in = 0 #temporary value

if (angle % 30) == 0: #the % symbol checks for remainder

radius_in = 210

else:

radius_in = 220

现在,转换为弧度(Python 中的数学需要弧度来表示 sin 和 cos):

    radians = (angle / 180) * math.pi

接下来,将坐标分配给变量,以便更容易阅读。

    x_out = (radius_out * math.cos(radians)) + 300
y_out = (radius_out * math.sin(radians)) + 300

x_in = (radius_in * math.cos(radians)) + 300
y_in = (radius_in * math.sin(radians)) + 300

#the (+ 300) moves each point from a relative center of 0,0 to 300,300

最后,我们将其分配给一个列表,以便以后需要时可以访问它。确保在 for 循环之外提前定义此列表。

     coords.append( w.create_line(x_out, y_out, x_in, y_in) )

这应该给你你的时钟线。

注意:由于 tkinter 分配 x 和 y 坐标的方式,这将从 3 小时线顺时针绘制线回到它。

希望这对您有帮助!如果有什么不明白的地方可以在下面评论。

关于python-3.x - Python 3 Tkinter Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42613901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com