2017-03-05 133 views
3

我想绘制一个可行的时钟。我正在使用600x600表单。我不能'弄清楚如何将椭圆放在表格的中心,或者如何在椭圆内添加分钟或秒钟刻度标记。我试过短跑,但无法让它看起来正确。有什么建议么。提前致谢。Python 3 Tkinter帆布

这是我迄今所做的:

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() 

回答

5

的拉深形状的中心时,为它绘制指定的两个点的中间。目前,您的形状的中间点(从75, 75500, 500)是237.5,因此,如果您希望其中间位置成为页面的中间位置,并保留75, 75坐标,则必须使另一个为525, 525以完全反映第一。

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

import math 

,对于数学原理:上半径r的圆的任何点可以被表示为点(r*cosθ), (r*sinθ),其中θ是从中心到该点的角度。这很重要的原因是,你希望钟面上的每条线都指向圆的中心。要做到这一点,我们需要两点来把这条线画在中心点上,幸运的是对于我们来说,这意味着线上的两个点都在不同的圆上(我们的圆和其中的一个),但是在相同的圆上从中心的角度。因为我们想要12小时左右的圆点,以及每个(总共60个点)和圆周360度(每6度1点)之间的4分钟点,我们需要一个循环,通过这一点。

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需求弧度正弦和余弦作为数学)转换成弧度:

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小时线顺时针绘制回线。

希望这有帮助!如果有什么不明白的地方,请在下面留言。