Как временно приостановить графический интерфейс в Tkinter? [Дубликат]

Это может произойти из-за того, что у вас есть контроль, который вытащил и создал выход или действие, и забыл его удалить. Даже если вы удалили код или даже если вы сделали достаточно cmd + Z, вам нужно будет подключиться к инспектору соединений вашей раскадровки и посмотреть, не создано ли действие или выход, которые вы создали, или нет.

59
задан nbro 21 May 2015 в 00:17
поделиться

4 ответа

У корневых окон 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 является однопоточным. Задержка обычно измеряется в микросекундах.

87
ответ дан Bryan Oakley 20 August 2018 в 21:06
поделиться
  • 1
    Не будут ли рекурсивные вызовы самому себе «максимальными рекурсиями для достигнутого объекта python»? ошибка? – Satwik Pasani 29 December 2017 в 06:20
  • 2
    @SatwikPasani: нет, потому что это не рекурсивный звонок. Он просто ставит работу в очередь. – Bryan Oakley 29 December 2017 в 13:20
  • 3
    как запустить func только один раз с задержкой? – user924 17 April 2018 в 10:28
  • 4
    @ user924: self.root.after(delay, func). – Bryan Oakley 17 April 2018 в 10:55

Пример использования 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()
7
ответ дан David Poole 20 August 2018 в 21:06
поделиться
  • 1
    Это хороший ответ, с одной важной вещью - отображаемое время - это действительно системное время, а не какое-то накопленное время ошибки (если вы ждете «около 1000 мс» 60 раз, вы получаете «около минуты», а не 60 senconds , и ошибка растет со временем). Тем не менее - ваши часы могут пропускать секунды на дисплее - вы можете накапливать второстепенные ошибки, а затем, например, пропустите 2 с вперед. Я бы предложил: self.after(1000 - int(1000 * (time.time() - int(time.time()))) or 1000, self.onUpdate). Вероятно, лучше сохранить time.time() до переменной перед этим выражением. – Tomasz Gandor 12 June 2017 в 18:19
  • 2
    Я стремлюсь быть достаточно классным, чтобы вставлять xkcd в мои комментарии :) – bitsmack 21 June 2017 в 14:53

Я просто создал простой таймер с использованием шаблона MVP (однако это может быть излишним для этого простого проекта). Он выключился, запустил / приостановил и остановил кнопку. Время отображается в формате HH: MM: SS. Счет времени выполняется с использованием потока, который выполняется несколько раз в секунду, и разницы между временем начала таймера и текущим временем.

Исходный код на github

1
ответ дан Herman Yanush 20 August 2018 в 21:06
поделиться
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()
2
ответ дан Ravikiran D 20 August 2018 в 21:06
поделиться
  • 1
    Было бы полезно, если бы вы могли добавить описание. Просто копировать / вставлять код редко полезно ;-) – Martin Tournoij 26 September 2017 в 13:21
  • 2
    этот код дает точное время локации. Он также служит в качестве таймера. – Ravikiran D 26 September 2017 в 16:27
Другие вопросы по тегам:

Похожие вопросы: