模拟时钟项目上的笨拙/缓慢拖动功能

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

我刚刚完成了我的第一个Python项目,一个模拟时钟。我设法达到一种状态,在此状态下,我实现了所想的一切,并解决了随后的问题。我添加的最后一件事是时钟的拖动功能,虽然它可以正常工作,但它似乎很慢或至少不平滑。目前,我缺乏知识和经验,无法理解为什么会发生这种情况,更不用说修复它了。 :)

这是我的代码:

# Imported tkinter for its methods
import tkinter as tk

# Imported turtle for drawing the clock's hands
import turtle

# Imported time to handle setting and updating the time
import time


# Declared and set the color used for transparency
transparent_clr = '#FB00FF'

# Setup a borderless window with transparent background
# and always on top flag
root = tk.Tk()
root.overrideredirect(True)
root.wm_attributes('-topmost', 1)
root.deiconify()
root.attributes('-transparentcolor', transparent_clr)

# Setup the clock's face using an image
Clock_bg = tk.PhotoImage(file='Clock_bg.png')
canvas = tk.Canvas(width=300, height=300, highlightthickness=0)
screen = turtle.TurtleScreen(canvas)
canvas.create_image(0, 0, image=Clock_bg)
canvas.pack()

screen.tracer(0)
screen.bgcolor(transparent_clr)

# Configure the pen used for the clock's hands
draw = turtle.RawTurtle(screen)
draw.hideturtle()
draw.speed(0)
draw.pensize(3)

# Retain Windows TaskBar visibility and function such as exiting
# the app
wn = tk.Toplevel(root)
wn.iconify()
wn.iconbitmap('Clock_icon.ico')
wn.attributes('-alpha', 0.0)


def wn_destroy():
    wn.protocol('WM_DELETE_WINDOW', exit_func)


def exit_func():
    root.destroy()


wn_destroy()

# Make the clock draggable


def draggable():
    root._offsetx = 0
    root._offsety = 0
    root.bind('<Button-1>', winclick)
    root.bind('<B1-Motion>', windrag)


def windrag(event):
    x = root.winfo_pointerx() - root._offsetx
    y = root.winfo_pointery() - root._offsety
    root.geometry('+{x}+{y}'.format(x=x, y=y))


def winclick(event):
    root._offsetx = event.x
    root._offsety = event.y


draggable()

# Draw the clock and its hands


def draw_clock(h, m, s, draw):

    # Draw the hours hand
    draw.penup()
    draw.goto(0, 0)
    draw.color('black')
    draw.setheading(90)
    angle = (h / 12) * 360 + (m / 60) * 30
    draw.rt(angle)
    draw.pendown()
    draw.fd(70)

    # Draw the minutes hand
    draw.penup()
    draw.goto(0, 0)
    draw.color('black')
    draw.setheading(90)
    angle = (m / 60) * 360 + (s / 60) * 6
    draw.rt(angle)
    draw.pendown()
    draw.fd(100)

    # Draw the seconds hand
    draw.penup()
    draw.goto(0, 0)
    draw.color('red')
    draw.setheading(90)
    angle = (s / 60) * 360
    draw.rt(angle)
    draw.pendown()
    draw.fd(60)


# Update the time in real time
while True:
    # Declared and set the hour, minutes and seconds
    h = int(time.strftime('%I'))
    m = int(time.strftime('%M'))
    s = int(time.strftime('%S'))

    draw_clock(h, m, s, draw)
    screen.update()

    time.sleep(1)

    draw.clear()
python python-3.x tkinter draggable turtle-graphics
1个回答
4
投票

“”您正在将自己的mainloop与time.sleep(1)一起使用,因此root.geometry(仅每秒被调用一次。–stovfl“

感谢十亿,stovf1!

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