Секундомер на Python и Tkinter

PythonBeginner
Практиковаться сейчас

Введение

В этом проекте мы создадим простое приложение секундомера на Python с использованием Tkinter. Секундомер будет иметь функции запуска, остановки, сброса и выхода. Мы будем использовать библиотеку Tkinter для графических компонентов пользовательского интерфейса (GUI) и библиотеку time для операций, связанных с временем.

👀 Предварительный просмотр

Предварительный просмотр GUI секундомера

🎯 Задачи

В этом проекте вы научитесь:

  • Как импортировать необходимые библиотеки для GUI и операций, связанных с временем
  • Как определить класс StopWatch, который наследует класс Frame
  • Как создать графические компоненты для секундомера
  • Как обновлять пройденное время и отображать его в GUI
  • Как реализовать функции запуска, остановки и сброса секундомера
  • Как создать главную функцию для инициализации объекта StopWatch и добавления кнопок для взаимодействия

🏆 Достижения

После завершения этого проекта вы сможете:

  • Создать GUI-приложение на Python с использованием Tkinter
  • Работать с операциями, связанными с временем, в Python
  • Реализовать функцию секундомера

Создайте файлы проекта

Сначала создайте новый файл с именем stopwatch.py и откройте его в предпочитаемом редакторе кода.

cd ~/project
touch stopwatch.py
✨ Проверить решение и практиковаться

Импортируйте необходимые библиотеки

В файле stopwatch.py начните с импорта требуемых библиотек. Для графических компонентов нам нужна Tkinter, для виджетов с оформлением - ttk, а для операций, связанных с временем - time. Добавьте следующий код в начало файла:

from tkinter import *
from tkinter import ttk
import time
✨ Проверить решение и практиковаться

Определите класс StopWatch

Далее определите класс с именем StopWatch, который наследует класс Frame. Мы будем использовать этот класс для создания функциональности секундомера. Добавьте следующий код после инструкций импорта:

class StopWatch(Frame):
    def __init__(self, parent=None, **kw):
        Frame.__init__(self, parent, kw)
        self._start = 0.0
        self._elapsedtime = 0.0
        self._running = 0
        self.timestr = StringVar()

        self.makeWidgets()
✨ Проверить решение и практиковаться

Создайте компоненты графического интерфейса

Внутри класса StopWatch добавьте метод с именем makeWidgets, который создает и размещает графические компоненты. Этот метод будет вызываться из конструктора. Добавьте следующий код внутри класса StopWatch:

    def makeWidgets(self):
        l = ttk.Label(self, textvariable=self.timestr)
        self._setTime(self._elapsedtime)
        l.pack(fill=X, expand=NO, pady=2, padx=2)
✨ Проверить решение и практиковаться

Обновите пройденное время

Добавьте метод с именем _update внутри класса StopWatch. Этот метод будет вычислять пройденное время и обновлять графический интерфейс. Добавьте следующий код внутри класса StopWatch:

    def _update(self):
        self._elapsedtime = time.time() - self._start
        self._setTime(self._elapsedtime)
        self._timer = self.after(50, self._update)
✨ Проверить решение и практиковаться

Установите время

Добавьте метод с именем _setTime внутри класса StopWatch. Этот метод будет форматировать время и обновлять переменную timestr. Добавьте следующий код внутри класса StopWatch:

    def _setTime(self, elap):
        minutes = int(elap / 60)
        hours = int(minutes / 60)
        seconds = int(elap - minutes * 60.0)
        hseconds = int((elap - minutes * 60.0 - seconds) * 100)
        self.timestr.set('%02d:%02d:%02d:%02d' % (hours, minutes, seconds, hseconds))
✨ Проверить решение и практиковаться

Реализуйте функцию запуска

Добавьте метод с именем Start внутри класса StopWatch. Этот метод будет запускать секундомер. Добавьте следующий код внутри класса StopWatch:

    def Start(self):
        if not self._running:
            self._start = time.time() - self._elapsedtime
            self._update()
            self._running = 1
✨ Проверить решение и практиковаться

Реализуйте функцию остановки

Добавьте метод с именем Stop внутри класса StopWatch. Этот метод будет останавливать секундомер. Добавьте следующий код внутри класса StopWatch:

    def Stop(self):
        if self._running:
            self.after_cancel(self._timer)
            self._elapsedtime = time.time() - self._start
            self._setTime(self._elapsedtime)
            self._running = 0
✨ Проверить решение и практиковаться

Реализуйте функцию сброса

Добавьте метод с именем Reset внутри класса StopWatch. Этот метод будет сбрасывать секундомер. Добавьте следующий код внутри класса StopWatch:

    def Reset(self):
        self._start = time.time()
        self._elapsedtime = 0.0
        self._setTime(self._elapsedtime)
✨ Проверить решение и практиковаться

Создайте главную функцию

Добавьте функцию main вне класса StopWatch. Эта функция будет создавать главное окно приложения, инициализировать объект StopWatch и добавлять кнопки для запуска, остановки, сброса и выхода. Добавьте следующий код после класса StopWatch:

def main():
    root = Tk()
    sw = StopWatch(root)
    sw.pack(side=TOP)

    Button(root, text='Start', command=sw.Start).pack(side=LEFT)
    Button(root, text='Stop', command=sw.Stop).pack(side=LEFT)
    Button(root, text='Reset', command=sw.Reset).pack(side=LEFT)
    Button(root, text='Quit', command=root.quit).pack(side=LEFT)

    root.mainloop()


if __name__ == '__main__':
    main()
✨ Проверить решение и практиковаться

Запустите проект

Наконец, перейдите на рабочий стол и запустите проект с использованием следующей команды:

python stopwatch.py
stopwatch project execution
✨ Проверить решение и практиковаться

Резюме

Поздравляем! Вы успешно создали приложение для секундомера с использованием Python и Tkinter. Мы прошли по шагам создания файлов проекта, импортирования необходимых библиотек, определения класса StopWatch, создания компонентов GUI, обновления времени, прошедшего с начала запуска, реализации функций запуска, остановки и сброса и создания главного приложения. Теперь вы можете запустить проект и использовать кнопки для управления секундомером.