[PYTHON] Ich habe einen einfachen Timer erstellt, der vom Terminal aus gestartet werden kann

Dieser Artikel wurde als Artikel zum 9. Tag des IS17er Adventskalenders verfasst. Klicken Sie hier für den Artikel über Tag 8.

Überblick

Ich habe eine Timer-App erstellt, die vom Terminal aus mit einer Bibliothek namens Tkinter of Python gestartet werden kann. Sie können sehen, wie es funktioniert, indem Sie sich das Bild ansehen. Bitte benutzen Sie es auf jeden Fall! tmr.png

Ja, machen wir einen einfachen Timer

Vor kurzem habe ich meine Konzentration verloren, und als ich vor meinem Computer saß, waren zwei Stunden vergangen, bevor ich es wusste. Deshalb habe ich einen Timer erstellt, der einfach vom Terminal aus gestartet werden kann, damit ich mich für kurze Zeit konzentrieren und die Zeit verwalten kann. Ich habe mich dazu entschlossen (gestern Abend).

Konzept

(Als ich diesen Abschnitt schrieb, schrieb ich das Programm noch nicht) Zum Beispiel als Image der diesmal zu erstellenden Anwendung $ tmr 5m30s -t kadai Das Bild ist, dass, wenn Sie einen Befehl wie diesen drücken, ein kleines Fenster in der oberen rechten Ecke des Bildschirms erscheint und herunterzählt. -t ist optional der Titel des Timers. Selbst wenn ich eine sehr komplizierte Funktion implementiere, werde ich sie nicht verwenden, daher frage ich mich, ob dies vorerst in Ordnung ist. Ich frage mich, ob es einen optionalen Benachrichtigungston wie Slack gibt. Wenn sich die Farbe danach bei jedem Start zufällig ändert, können Sie sie verwenden, ohne sich zu langweilen.

Schreiben

Ich habe überhaupt keine Desktop-Anwendung geschrieben, weil es normalerweise ein Web-System ist, aber wenn ich es ein bisschen gegoogelt habe, scheint Tkinter Spaß zu machen, also habe ich dies geschrieben Ich habe mich entschieden, es zu benutzen. Es scheint, dass Sie mit Python mit Tkinter einfach eine GUI erstellen können.

Code

Der Code bestand aus ungefähr 100 Zeilen, also fügen Sie alles ein. Aufgrund dieser Kürze habe ich es in eine Datei geschafft. Fühlen Sie sich frei, es anzupassen.

tmr.py


#!/usr/bin/env python
# -*- coding: utf8 -*-
import sys
import re
import argparse
import random
import Tkinter as tk

class App():
  def __init__(self):
    self.window_size = 150
    self.fps = 10
    self.font_size = 23
    self.option = self.parse_args()
    self.time = self.get_timesec()
    self.period = self.time
    self.root = self.set_root()
    self.canvas = self.set_canvas()
    self.label = self.set_label()
    self.progress = self.init_progress()
    self.update()
    self.run()

  def parse_args(self):
    parser = argparse.ArgumentParser(description="Show simple countdown timer on desktop.")
    parser.add_argument("period", action="store", type=str, help="Set period for your timer.")
    parser.add_argument("-t", dest="title", action="store", default="Timer", help="Set title for your timer.")
    parser.add_argument("-n", dest="notify", action="store_false", default=True, help="Disable notification.")
    return parser.parse_args()

  def get_timesec(self):
    if re.search("\A(?:\d+h)?(?:\d+m)?(?:\d+s)?$", self.option.period) is None:
      print "Incorrect format of period:", self.option.period
      print "Set period like 10m30s"
      sys.exit()
    time = 0
    if re.search("\d+h", self.option.period) is not None:
      time += int(re.search("\d+h", self.option.period).group(0)[:-1]) * 3600
    if re.search("\d+m", self.option.period) is not None:
      time += int(re.search("\d+m", self.option.period).group(0)[:-1]) * 60
    if re.search("\d+s", self.option.period) is not None:
      time += int(re.search("\d+s", self.option.period).group(0)[:-1])
    if time > 9 * 3600 + 59 * 60 + 59:
      print "Too long period."
      sys.exit()
    return time

  def set_root(self):
    root = tk.Tk()
    root.resizable(0,0)
    window_size = self.window_size
    colors = ["#f44336", "#E91E63", "#9C27B0", "#673AB7", "#3F51B5", "#2196F3", "#03A9F4", "#00BCD4", "#009688", "#4CAF50", "#8BC34A", "#CDDC39", "#FFEB3B", "#FFC107", "#FF9800", "#FF5722", "#795548", "#9E9E9E", "#607D8B"]
    root.title(self.option.title)
    root.geometry("%dx%d+%d+%d" % (window_size, window_size, root.winfo_screenwidth() - window_size, 0))
    root.configure(bg=random.choice(colors))
    root.attributes("-alpha", 0.5)
    root.attributes("-topmost", True)
    return root

  def set_label(self):
    window_size = self.window_size
    label = self.canvas.create_text((window_size / 2, window_size / 2), text="")
    self.canvas.itemconfig(label, font=("Menlo-Regular", self.font_size))
    return label

  def set_canvas(self):
    window_size = self.window_size
    canvas = tk.Canvas(self.root, width=window_size, height=window_size, highlightthickness=0)
    canvas.grid()
    return canvas

  def format_time(self, timesec):
    m, s = divmod(timesec, 60)
    h, m = divmod(m, 60)
    if h == 0:
      if m == 0:
        return "%02ds" % (s)
      else:
        return "%02dm%02ds" % (m, s)
    else:
      return "%dh%02dm%02ds" % (h, m, s)

  def init_progress(self):
    color = self.root["bg"]
    window_size = self.window_size
    progress = self.canvas.create_arc(window_size * 0.1, window_size * 0.1, window_size * 0.9, window_size * 0.9, style="arc", width="%d" % (window_size / 15), outline=color, start=90, extent=360)
    return progress

  def update(self):
    window_size = self.window_size
    self.canvas.itemconfig(self.label, text=self.format_time(self.time))
    extent = 360.0 * self.time / self.period
    self.canvas.itemconfig(self.progress, start=450-extent, extent=extent)
    self.time -= 1.0 / self.fps
    if self.time < 0:
      if self.option.notify:
        print '\a'
      sys.exit()
    self.root.after(1000 / self.fps, self.update)

  def run(self):
    self.root.mainloop()

app = App()

Wie benutzt man

Ich habe es in GitHub geschrieben, aber hier darf ich es nicht klonen.

  1. Kopieren Sie den obigen Code und speichern Sie ihn unter dem Dateinamen tmr (keine Erweiterung).
  2. chmod 755 tmr
  3. Fügen Sie etwas wie `export PATH = $ PATH: / Users / [Benutzername] / timer``` zu` ~ / .bash_rc oder `` ~ / .bash_profile hinzu. Wenn Sie dies nicht verstehen, googeln Sie das Hinzufügen von PATH.
  4. Führen Sie `source ~ / .bash_rc``` oder` source ~ / .bash_profile``` aus und starten Sie das Terminal neu
  5. Versuchen Sie, `` `tmr 10m30s``` zu treffen!

Schwierigkeiten (Codeerklärung)

Eigentlich gibt es einige, aber vorerst gibt es einige.

Reguläre Ausdrücke

Es ist ein regulärer Ausdruck, den jeder liebt.

"\A(?:\d+h)?(?:\d+m)?(?:\d+s)?$"Das ist der Anfang"\A(?:\d+h)?(?:\d+m)?(?:\d+s)?\z"Ich habe das geschrieben und None für immer in Massenproduktion hergestellt. Gewöhnen Sie sich an reguläre Ausdrücke.



#### So schreiben Sie Code präzise
 Python verfügt standardmäßig über eine Vielzahl nützlicher Funktionen. Selbst wenn Sie etwas selbst schreiben möchten, sollten Sie es zuerst überprüfen. In den meisten Fällen ist es schneller, es selbst zu schreiben, aber da es eine schlechte Praxis ist, dass die Behandlung von Eckfällen problematisch ist und sich die Lesbarkeit verschlechtert, habe ich nur die vorhandenen Funktionen gegoogelt. Darüber hinaus verhalten sich im Fall von Python mehrere vorhandene Funktionen häufig gleich, sodass die Auswahl einer Bibliothek einige Zeit in Anspruch nahm, damit die vorhandenen Funktionen ein gutes Gefühl der Einheit aufweisen. Dies kann eine Berufskrankheit sein.

## schließlich
 Sie können es von [GitHub](https://github.com/xuzijian629/timer) klonen. Verwenden Sie es daher (wenn Sie Probleme haben, können Sie den Code so kopieren, wie er ist). Ich bin froh zu weinen, wenn du die Hauptrolle spielst! Außerdem sind Benachrichtigungstöne usw. zum Zeitpunkt des Schreibens nicht implementiert, sodass ich sie später hinzufügen kann.

 Abgesehen davon gibt es im Fall von Mac einen genialen Befehl namens "say"
```$ sleep 100 &&sag Ende```
 Wenn Sie so etwas tun, wird nach 100 Sekunden "Ende" angezeigt (wenn die Sprache auf Japanisch eingestellt ist).

 Na dann, bis morgen ~

 [Ergänzung] Benachrichtigungston wurde implementiert (der obige Code wurde korrigiert).
```print '\a'```
 Du kannst gehen! Ist es nicht ein Python-Gott ...!


Recommended Posts

Ich habe einen einfachen Timer erstellt, der vom Terminal aus gestartet werden kann
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
Ich habe ein Modul erstellt, das leicht fehlerhaft sein kann, aber ich kann das Argument nicht von entry_points übergeben
[Atcoder] [C ++] Ich habe ein Testautomatisierungstool erstellt, das während des Wettbewerbs verwendet werden kann
Ich habe einen Küchentimer erstellt, der in der Statusleiste angezeigt wird!
Ich habe ein Docker-Image erstellt, das FBX SDK Python von Node.js aus aufrufen kann
Ich habe einen harten Pomodoro-Timer entwickelt, der mit CUI funktioniert
Ich habe die Vorbehandlung untersucht, die mit PyCaret durchgeführt werden kann
Ich habe ein Plug-In erstellt, das "Daruma-san Fell" mit Minecraft ausführen kann
Kann ich Datenwissenschaftler werden?
Ich habe ein Tool erstellt, um automatisch ein einfaches ER-Diagramm aus der Anweisung CREATE TABLE zu generieren
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Aus einem Buch, das der Programmierer lernen kann ... (Python): Finden Sie den häufigsten Wert
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
Ich habe den Befehl gegeben, einen farbenfrohen Kalender im Terminal anzuzeigen
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
Ich habe einen Linienbot erstellt, der das Geschlecht und das Alter einer Person anhand des Bildes errät
Ich habe etwas mit Python gemacht, das sich JETZT LADEN auf dem Terminal von links nach rechts bewegt
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe eine generische Python-Projektvorlage erstellt
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert
[Python] Ich habe ein Dienstprogramm erstellt, das wie ein Pfad auf den Diktattyp zugreifen kann
Ich habe eine Bibliothek konoha gemacht, die den Tokenizer auf ein schönes Gefühl umstellt
ConSinGAN: Ich habe versucht, GAN zu verwenden, das aus einem Bild generiert werden kann
Ich habe ein Modul PyNanaco erstellt, das Nanaco-Guthaben mit Python belasten kann
Da ich zu verschiedenen Zeiten anfing zu arbeiten, machte ich einen Bot, der mir die Zeit sagt, die Arbeit zu verlassen
Ich habe einen LINE BOT erstellt, der mithilfe der Flickr-API ein Bild von Reis-Terroristen zurückgibt
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
Ich habe eine einfache Brieftasche aus Bitcoin mit Pycoin gemacht
Ich habe ein Tool zum Generieren von Markdown aus der exportierten Scrapbox-JSON-Datei erstellt
Ich konnte dem Futon nicht entkommen und baute eine vollautomatische Futon-Peeling-Maschine.
In Python habe ich einen LINE-Bot erstellt, der Polleninformationen aus Standortinformationen sendet.
Ich habe einen einfachen RSS-Reader ~ C Edition ~ gemacht
Ich habe eine Twitter-App erstellt, die die Zeichen der Vorverbindung mit Heroku entschlüsselt (Fehler).
Konvertieren Sie Bilder aus dem FlyCapture SDK in ein Formular, das mit openCV verwendet werden kann
[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
[Django] Drücken Sie einen Befehl, den Sie in dem Prozess ausgeführt haben, der auf manage.py ausgeführt wird.
Ich habe versucht, eine Memo-App zu erstellen, die Pomodoro sein kann, aber eine Reflexionsaufzeichnung
Die Geschichte, dass sendmail, die im Terminal ausgeführt werden kann, mit cron nicht funktioniert hat
[Python / C] Ich habe versucht, ein Gerät zu erstellen, das den Bildschirm eines PCs drahtlos aus der Ferne scrollt.
Ein Mechanismus zum Aufrufen von Ruby-Methoden aus Python, der in 200 Zeilen ausgeführt werden kann
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert (Google Kalender Edition).
Ich habe meine eigene Django Middleware erstellt, damit ich von überall auf Anforderungsinformationen zugreifen kann
Merkmalsmenge, die aus Zeitreihendaten extrahiert werden kann
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Aus einem Buch, das Programmierer lernen können ... (Python): Zeiger
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Ich habe einen Befehl zum Markieren des Tabellenclips gegeben
Listen Sie die Klassen auf, auf die ObjCClass verweisen kann
〇✕ Ich habe ein Spiel gemacht
Ich habe ein Tool erstellt, um automatisch ein Zustandsübergangsdiagramm zu generieren, das sowohl für die Webentwicklung als auch für die Anwendungsentwicklung verwendet werden kann
So richten Sie einen einfachen SMTP-Server ein, der lokal in Python getestet werden kann
Da ImageDataGenerator nicht mehr verwendet werden kann, eine Geschichte zum Erstellen einer Datenerweiterungsklasse für Tensorflow> = 2.0
[Python] Ein Programm, um die Anzahl der Äpfel und Orangen zu ermitteln, die geerntet werden können
Konvertieren Sie aus SpriteUV2 exportierte Netzdaten in ein Format, das von Spine importiert werden kann
Eine Geschichte, die stolperte, als ich mit Transformer einen Chat-Chat-Bot erstellte
[Python] Poesie Ich habe angefangen & Eindruck, dass ich von Pipenv zu Poesie gewechselt bin
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht