Это может произойти из-за того, что у вас есть контроль, который вытащил и создал выход или действие, и забыл его удалить. Даже если вы удалили код или даже если вы сделали достаточно cmd + Z, вам нужно будет подключиться к инспектору соединений вашей раскадровки и посмотреть, не создано ли действие или выход, которые вы создали, или нет.
У корневых окон Tkinter есть метод, называемый after
, который можно использовать для планирования функции, которая будет вызываться через определенный период времени. Если сама эта функция вызывает after
, вы настроили автоматически повторяющееся событие.
Вот рабочий пример:
# for python 3.x use 'tkinter' rather than 'Tkinter'
import Tkinter as tk
import time
class App():
def __init__(self):
self.root = tk.Tk()
self.label = tk.Label(text="")
self.label.pack()
self.update_clock()
self.root.mainloop()
def update_clock(self):
now = time.strftime("%H:%M:%S")
self.label.configure(text=now)
self.root.after(1000, self.update_clock)
app=App()
Имейте в виду, что after
не гарантирует, что функция будет работать точно вовремя. Только расписал задание, которое должно выполняться через определенное количество времени. Это приложение занято, может быть задержка до того, как он будет вызван, поскольку Tkinter является однопоточным. Задержка обычно измеряется в микросекундах.
Пример использования Python3 с использованием frame.after (), а не приложения верхнего уровня. Также показано обновление метки с помощью StringVar ()
#!/usr/bin/env python3
# Display UTC.
# started with https://docs.python.org/3.4/library/tkinter.html#module-tkinter
import tkinter as tk
import time
def current_iso8601():
"""Get current date and time in ISO8601"""
# https://en.wikipedia.org/wiki/ISO_8601
# https://xkcd.com/1179/
return time.strftime("%Y%m%dT%H%M%SZ", time.gmtime())
class Application(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.now = tk.StringVar()
self.time = tk.Label(self, font=('Helvetica', 24))
self.time.pack(side="top")
self.time["textvariable"] = self.now
self.QUIT = tk.Button(self, text="QUIT", fg="red",
command=root.destroy)
self.QUIT.pack(side="bottom")
# initial time display
self.onUpdate()
def onUpdate(self):
# update displayed time
self.now.set(current_iso8601())
# schedule timer to call myself after 1 second
self.after(1000, self.onUpdate)
root = tk.Tk()
app = Application(master=root)
root.mainloop()
self.after(1000 - int(1000 * (time.time() - int(time.time()))) or 1000, self.onUpdate)
. Вероятно, лучше сохранить time.time()
до переменной перед этим выражением.
– Tomasz Gandor
12 June 2017 в 18:19
Я просто создал простой таймер с использованием шаблона MVP (однако это может быть излишним для этого простого проекта). Он выключился, запустил / приостановил и остановил кнопку. Время отображается в формате HH: MM: SS. Счет времени выполняется с использованием потока, который выполняется несколько раз в секунду, и разницы между временем начала таймера и текущим временем.
from tkinter import *
import time
tk=Tk()
def clock():
t=time.strftime('%I:%M:%S',time.localtime())
if t!='':
label1.config(text=t,font='times 25')
tk.after(100,clock)
label1=Label(tk,justify='center')
label1.pack()
clock()
tk.mainloop()
self.root.after(delay, func)
. – Bryan Oakley 17 April 2018 в 10:55