blog.furas.pl
# prywatne notatki - Python, Linux, Machine Learning, etc.

Przykład użycia `after` w Tkinter do wyświetlania aktualnego czasu

#!/usr/bin/env python
#-*- coding: utf-8 -*-

try:
    import Tkinter as tk # Python 2.x
except:
    import tkinter as tk # Python 3.x

import time

def update_time():
    lbl['text'] = time.strftime('Aktualny czas: %H:%M:%S')
    master.after(1000, update_time)

master = tk.Tk()

lbl = tk.Label(master, text='Aktualny czas: 00:00:00')
lbl.pack()

update_time()
#master.after(1000, update_time)

master.mainloop()

Korzystając z try/except importuje moduł Tkinter (Python 2.x) lub tkinter (Python 3.x) i przypisuje mu alias tk. Dzięki temu program będzie działał zarówno z Python 2.x jak i 3.x

Nie importuję za pomocą from Tkinter import * oraz używam aliasu tk aby w dajszej części kodu było wyraźnie widać, które elementy pochodzą z modułu Tkinter

Wywołanie tk.Tk() tworzy obiekt głównego okna, które przypisuje do zmiennej o zwyczajowej nazwie master.

tk.Label(master, text=...) tworzy pole z napisem, które zostanie umieszczone wewnątrz okna master i nadaje mu początkową wartość napisu.

lbl.pack() wylicza (automatycznie) położenie pola z napisem wewnętrz okna zgodnie z pewnymi przyjętymi regułami. Jednocześnie sprawia, że pole będzie wyświetlane w oknie.

update_time() wywołuje (natychmiast) funkcję, która aktualizuje pole z napisem a następnie umieszcza funkcję update_time na specjalnej liście zadań do wykonania póżniej. W tym przypadku ma ona zostać wykonane po 1000ms (czyli po 1 sekundzie)

Po 1 sekundzie zostanie wykonane update_time, które ponownie użyje after aby uruchomić siebie samego po kolejnej sekundzie więc update_time będzie stale wywoływane w odstępach sekundowych i aktualizować pole z napisem.

Ostatnią instrukcją jest master.mainloop(), które uruchamia nieskończoną pętle (ang. loop) a w tej pętli będą wykonywane wszystkie rzeczy istotne do działania programu. Tam będą pobierane z systemu informacje o wciśniętych klawiszach i ruchu myszki i będzie to przekazywane do odpowiednich elementów w oknie. Tam też będą wywoływane (w odpowiednim czasie) funkcje, które zostały umieszczone przez after na specjalnej liście zadań oczekujących.

Pętla ta wykonuje się aż do zamknięcia okna więc wszelkie instrukcje umieszczone po linii z mainloop() zostaną wykonane dopiero po zamknięciu okna.

Ponieważ mainloop() wykonuje na przemian różne rzeczy - w tym funkcje umieszczone przez after - więc funkcje podane w after nie mogą zbyt długo się wykonywać bo nie zostaną wykonane pozostałe zadania (np. obsługa myszki i klawiatury) i program przestanie reagować na działania użytkownika - "zawiesi się"

Książki: python-dla-kazdego-podstawy-programowania python-wprowadzenie python-leksykon-kieszonkowy python-receptury python-programuj-szybko-i-wydajnie python-projekty-do-wykorzystania black-hat-python-jezyk-python-dla-hackerow-i-pentesterow efektywny-python-59-sposobow-na-lepszy-kod tdd-w-praktyce-niezawodny-kod-w-jezyku-python aplikacje-internetowe-z-django-najlepsze-receptury