Tkinter: Как заставить Tkinter обновить и удалить последние строки? - PullRequest
2 голосов
/ 28 мая 2011

Проблема: стрелки часов в Tkinter вспыхивают, потому что я использую w.delete, но если я их не использую, то стрелки часов дублируются .. Пожалуйста, помогите.

import Tkinter as tk; import time
from math import cos,sin,pi
import sys
root=tk.Tk(); root.title("Clock")
w = tk.Canvas(root, width=320, height=320, bg="#456", relief= "sunken", border=10)

w.pack()

size=300
def funA():

    s=time.localtime()[5]
    m=time.localtime()[4]
    h=time.localtime()[3]
    w.update()
        degrees = 6*s
    angle = degrees*pi*2/360
    ox = 165
    oy = 165
    x = ox + size*sin(angle)*0.45
    y = oy - size*cos(angle)*0.45
    t = w.create_line(ox,oy,x,y, fill = "#ffc")

    degrees1 = 6*m
    angle1 = degrees1*pi*2/360
    ox1 = 165
    oy1 = 165
    x1 = ox1 + size*sin(angle1)*0.4
    y1 = oy1 - size*cos(angle1)*0.4
    t1 = w.create_line(ox1,oy1,x1,y1, fill = "Red", width=6)


    degrees2 = 30*h
    angle2 = degrees2*pi*2/360
    ox2 = 165
    oy2 = 165
    x2 = ox2 + size*sin(angle2)*0.2
    y2 = oy2 - size*cos(angle2)*0.2
    t2 = w.create_line(ox2,oy2,x2,y2, fill = "Black", width=8)
    w.update()
    root.after(200,funA)
    w.delete(t1)

root.after(1500, funA)
uzr1 = tk.Label(root, text="12", bg="#456" )
uzr1.place(x=160, y=13)
uzr2 = tk.Label(root, text="6", bg="#456" )
uzr2.place(x=160, y=303)
uzr3 = tk.Label(root, text="3", bg="#456" )
uzr3.place(x=310, y=160)
uzr4 = tk.Label(root, text="9", bg="#456" )
uzr4.place(x=11, y=160)
def Quit():
    root.after(700,root.destroy())

e = tk.Button(root,text="Quit", command=Quit)
e.pack()
root.mainloop()

Если я напишу в funA, w.delete(t), то секундная стрелка часов мигает, если нет, то ее дублирование .. Так же и со всеми стрелками часов ..

  • t - секундная стрелка
  • t1Минутная стрелка
  • t2 Часовая стрелка

Надеясь получить быстрый полезный ответ

1 Ответ

5 голосов
/ 28 мая 2011

Здесь есть несколько вещей, которые нужно исправить. Во-первых, вам не нужно звонить update. Вообще говоря, вы никогда не должны называть это, хотя это правило может быть нарушено, если вы поймете, почему это правило существует. Вы можете позвонить по номеру update_idletasks, что обычно и нужно, если вы чувствуете необходимость позвонить по номеру update. Даже этого можно избежать при правильном дизайне.

Во-вторых, нет необходимости удалять строку и создавать новую строку. У виджета холста есть метод с именем coords, который можно использовать для корректировки координат элемента.

В-третьих, вы можете использовать функцию тегов на холсте. Дайте каждой часовой стрелке тег с подходящим именем (например, «секунда», «минута», «час»), и вы будете использовать его, чтобы сообщить холсту, какой элемент обновить.

Наконец, приобретите привычку либо создавать класс приложения, либо помещать код приложения в функцию. Это облегчает решение проблемы невозможности вызова функции до тех пор, пока она не будет определена, и делает так, что вам не нужно использовать глобальные переменные.

Вот рабочий пример:

import Tkinter as tk; import time
from math import cos,sin,pi
import sys

class MyApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.size=300

        self.title("Clock")
        self.w = tk.Canvas(self, width=320, height=320, bg="#456", relief= "sunken", border=10)
        self.w.pack()

        self.w.create_line(0,0,0,0, fill="#ffc", tags="hour")
        self.w.create_line(0,0,0,0, fill="red", tags="minute")
        self.w.create_line(0,0,0,0, fill="black", tags="second")

        uzr1 = tk.Label(self, text="12", bg="#456" )
        uzr1.place(x=160, y=13)
        uzr2 = tk.Label(self, text="6", bg="#456" )
        uzr2.place(x=160, y=303)
        uzr3 = tk.Label(self, text="3", bg="#456" )
        uzr3.place(x=310, y=160)
        uzr4 = tk.Label(self, text="9", bg="#456" )
        uzr4.place(x=11, y=160)

        e = tk.Button(self,text="Quit", command=self.Quit)
        e.pack()

        self.update_clock()

    def update_clock(self):

        s=time.localtime()[5]
        m=time.localtime()[4]
        h=time.localtime()[3]

        degrees = 6*s
        angle = degrees*pi*2/360
        ox = 165
        oy = 165
        x = ox + self.size*sin(angle)*0.45
        y = oy - self.size*cos(angle)*0.45
        self.w.coords("hour", (ox,oy,x,y))

        degrees1 = 6*m
        angle1 = degrees1*pi*2/360
        ox1 = 165
        oy1 = 165
        x1 = ox1 + self.size*sin(angle1)*0.4
        y1 = oy1 - self.size*cos(angle1)*0.4
        self.w.coords("minute", (ox1,oy1,x1,y1))

        degrees2 = 30*h
        angle2 = degrees2*pi*2/360
        ox2 = 165
        oy2 = 165
        x2 = ox2 + self.size*sin(angle2)*0.2
        y2 = oy2 - self.size*cos(angle2)*0.2
        self.w.coords("second",(ox2,oy2,x2,y2))

        self.after(1000, self.update_clock)

    def Quit(self):
        self.after(700,self.destroy())

app = MyApp()
app.mainloop()
...