python-3.x - Python 3 Tkinter Canvas

标签 python-3.x canvas tkinter

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

相关文章:

python - 错误 : gunicorn: Failed to find application object 'app' in 'app'

python - 有什么建议可以重构以下 Pandas 代码吗?

python - 从字符串添加装饰器

HTML5 : Paint multiple canvases on one main canvas

python - 将命令行结果重定向到 tkinter GUI

python /tkinter : Events: call a function by mouse on widget

python - 如何在 Pycharm 的调试 session 中断期间向 python 类/对象添加方法?

javascript - canvas.getContext ("2d") 是否每次都返回相同的实例?

javascript - Html5 Canvas 动画无法正常工作

python - TheGui 实例没有属性 'read'