我正在尝试画一个可以工作的时钟。我使用的是 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/