1
0

More than 3 years have passed since last update.

pythonのtkinterで有効期限を表示するだけの処理

Last updated at Posted at 2020-02-07

事の発端

ソフトの有効期限を表示する処理を作って、関数をクラスにしてファイルに分離したので、コードをちょいと公開しようと思いました。

動作環境

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に代入され使えるようになるので、処理が複雑になっても問題ないです。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0