QTを利用して1つのきわめて簡単な図形化Python目覚まし時計のプログラムを書きます

2759 ワード

今日はPythonで書かれたGUIアプリについてお話しします.小さな目覚まし時計(スクリーンのヒントだけで、音はしませんよ)
まず、この目覚まし時計がどのように奇抜なのかを紹介しましょう.
コマンドラインで起動する必要があります.
タイトルバーはありません.
メニューがありません.
ボタンを閉じることさえできなかった.
実行インタフェースがありません.
ここを見て、皆さんが聞くに違いない.こんな弱いプログラムを作る必要はないだろう.明らかに、教育の意義は実際の用途より大きい.
他のモジュールのようにQTインタフェースパッケージはロードする必要があります.
コマンドライン入力を使用したのでsysモジュールも必要です.
時間がかかりましたが、timeモジュールを使用する必要はありません.QTが提供するQTimeモジュールを使用します.
まずimport文の部分を書きましょう. 

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
app = QApplication(sys.argv)

これはqtプログラムの命脈を制御するクラスで、後でゆっくり説明します.Qtプログラムごとに、似たような文が見つかります.
あとは目覚まし時計の時間を入力します.手順を踏む. 

try:
  message = "Alert!"
  if len(sys.argv) < 2:
    raise ValueError
  hours, mins = sys.argv[1].split(":")
  due = QTime(int(hours), int(mins))
  if not due.isValid():
    raise ValueError
  if len(sys.argv) > 2:
    message = " ".join(sys.argv[2:])
except ValueError:
  message = "Usage: alert.pyw HH:MM [optional message]"

例外処理が含まれています.アプリケーションでは、すべての例外を考慮する必要があります.
プログラムではraiseを使用して例外をトリガーします.プログラムを私たちの予想軌道に乗せる.
明らかに、上のプログラムは十分ではありません.GUIの部分を判断する時間はありません.
時間が来たかどうかをどのように判断するかは、特に正確ではない方法、タイミング判断を与えます. 

import time
while QTime.currentTime() < due:
#  20 
  time.sleep(20)

時間になると、次のステップにジャンプしてフォームを作成し、60 s遅延して閉じます. 

label = QLabel("" + message + "")
label.setWindowFlags(Qt.SplashScreen)
label.show()
QTimer.singleShot(60000, app.quit) # 1 minute
app.exec_()

QTimeモジュールについての紹介を書く必要があるようです.
今、すべての文を一緒に置いてください.テストしてみましょう.
完全なコードを添付:

import sys
import time
from PyQt4.QtCore import *
from PyQt4.QtGui import *
app = QApplication(sys.argv)
try:
  message = "Alert!"
  if len(sys.argv) < 2:
    raise ValueError
  hours, mins = sys.argv[1].split(":")
  due = QTime(int(hours), int(mins))
  if not due.isValid():
    raise ValueError
  if len(sys.argv) > 2:
    message = " ".join(sys.argv[2:])
except ValueError:
  message = "Usage: alert.pyw HH:MM [optional message]" # 24hr clock
while QTime.currentTime() < due:
  time.sleep(20) # 20 seconds
label = QLabel("" + message + "")
label.setWindowFlags(Qt.SplashScreen)
label.show()
QTimer.singleShot(60000, app.quit) # 1 minute
app.exec_()