事の発端
ソフトの有効期限を表示する処理を作って、関数をクラスにしてファイルに分離したので、コードをちょいと公開しようと思いました。
動作環境
windows10
PyCharm
Python
コード
まずは、関数だけのコードです。コンソールに使用期限を表示します。
import datetime
def main():
dict_end_date = {"年": 2020, "月": 2, "日": 8, "時": 23}
dt_now = datetime.datetime.now()
end_date = datetime.datetime(dict_end_date["年"], dict_end_date["月"], dict_end_date["日"])
if end_date < dt_now:
print("ソフトの使用期限が終了しています。")
else:
print("ソフトの使用期限は、" + str(dict_end_date["年"]) + "年" + str(dict_end_date["月"]) + "月" +
str(dict_end_date["日"]) + "日です。")
if __name__ == "__main__":
main()
クラス化したコード
関数をクラス化しました。ボタンなどコールバック関数から呼ばれてもいいように__call__
メソッドを実装してます。
import datetime
import tkinter as tk
import tkinter.messagebox
class ShowMessageEndDate:
def __init__(self, parent=None):
self.parent = parent
self.dict_end_date = {"年": 2020, "月": 7, "日": 31, "時": 23}
self.dt_now = datetime.datetime.now()
self.end_date = datetime.datetime(self.dict_end_date["年"], self.dict_end_date["月"], self.dict_end_date["日"])
self.str_end_data = "{0}年{1}月{2}日".format(str(self.dict_end_date["年"]), str(self.dict_end_date["月"]),
str(self.dict_end_date["日"]))
self.msg = "試用版のソフトの利用期限は、" + self.str_end_data + "です。"
def __call__(self, event=None):
self.show_message()
def show_message(self):
root = tkinter.Tk()
root.withdraw()
if self.end_date < self.dt_now:
tk.messagebox.showinfo('確認', "{0}\n有効期限が切れています。終了します。".format(self.msg))
return False
else:
tk.messagebox.showinfo('確認', self.msg)
return True
def main():
ShowMessageEndDate().show_message()
if __name__ == "__main__":
main()
呼び出し側のコード
# tkinterのフォームを表示するクラス
class ClassForm:
def __init__(・・・省略・・・)
(・・・省略・・・)
if (ファイル名).ShowMessageEndDate().show_message() is False:
return
if __name__ == "__main__":
self.root.title("タイトル")
self.root.mainloop()
処理を別ファイルに分離できるので、便利です。呼び出し元の変数を使いたいときは、実引数にselfを指定すると、インスタンス変数のparentに代入され使えるようになるので、処理が複雑になっても問題ないです。