ソースコード

いろんな記事で紹介したソースコードをまとめたページです。

【tkinter & nfcpy & pandas】簡易的なオフライン勤怠管理ツールを作ってみた

ソースコード

import tkinter as tk
import pandas as pd
import nfc
import binascii
import datetime as dt
import subprocess
import os


#-----------------------------------1.ホーム画面-----------------------------------

def home_display():
  # ウィンドウのタイトル
  root.title(r"勤怠管理ツール")
  #
  # メインページフレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ボタン作成
  button1_1 = tk.Button(frame, text="出社確認", font=(yu_font, 35, "bold"),
                        cursor=mouse, command=in_office1)
  button1_2 = tk.Button(frame, text="退社確認", font=(yu_font, 35, "bold"),
                        cursor=mouse, command=out_office1)
  button1_3 = tk.Button(frame, text="メンバー登録", font=(yu_font, 35, "bold"),
                        cursor=mouse, command=subscribe_member1)
  button1_4 = tk.Button(frame, text="管理ファイルを開く", font=(yu_font, 15),
                        fg="blue", cursor=mouse, command=folder_open)
  #
  # ボタンのカーソル時色変更
  button1_1.bind("<Enter>", enter_bg)
  button1_1.bind("<Leave>", leave_bg)
  button1_2.bind("<Enter>", enter_bg)
  button1_2.bind("<Leave>", leave_bg)
  button1_3.bind("<Enter>", enter_bg)
  button1_3.bind("<Leave>", leave_bg)
  button1_4.bind("<Enter>", enter_bg)
  button1_4.bind("<Leave>", leave_bg)
  #
  # ボタン配置
  button1_1.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  button1_2.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  button1_3.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  button1_4.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  #
  # frameを最上面へ
  frame.tkraise()


def folder_open():
  # 管理ファイルがあるフォルダを開く
  subprocess.Popen(["explorer", folder_path], shell=True)

#------------------------------------------------------------------------------

#-----------------------------------2_1.出社確認-----------------------------------

def in_office1():
  # ウィンドウのタイトル
  root.title(r"勤怠管理ツール|出社確認")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ラベル・ボタン作成
  label2_1 = tk.Label(frame, text="出社確認", font=(yu_font, 35))
  label2_2 = tk.Label(frame, text="ICカードを置いて\r\nOKボタンを押してください",
                      font=(yu_font, 35, "bold"))
  button2_1 = tk.Button(frame, text="OK", font=(yu_font, 25, "bold"),
                        cursor=mouse, command=ic_read2)
  button2_2 = tk.Button(frame, text="ホームへ", font=(yu_font, 15),
                        cursor=mouse, command=home_display)
  #
  # ボタンのカーソル時色変更
  button2_1.bind("<Enter>", enter_bg)
  button2_1.bind("<Leave>", leave_bg)
  button2_2.bind("<Enter>", enter_bg)
  button2_2.bind("<Leave>", leave_bg)
  #
  # ラベル・ボタン配置
  label2_1.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  label2_2.pack(side=tk.TOP, pady=30, ipadx=20, ipady=10)
  button2_1.pack(pady=20, ipadx=20, ipady=10)
  button2_2.pack(side=tk.BOTTOM, pady=20)
  #
  # frameを最上面へ
  frame.tkraise()


def ic_read2():
  # 読み取り待機
  clf = nfc.ContactlessFrontend("usb")
  try:
    tag = clf.connect(rdwr={"targets": ["212F", "424F"],
                            "on-connect": lambda tag: False})
  finally:
    clf.close()
  #
  # タグ情報からIDmを抽出
  if tag.TYPE == "Type3Tag":
    idm = binascii.hexlify(tag.idm).decode()
  #
  # 次のフレームへ
  in_office2(idm)

#-------------------------------------------------------------------------------
#-----------------------------------2_2.出社確認-----------------------------------

def in_office2(id_info):
  # ウィンドウのタイトル
  root.title(r"勤怠管理ツール|出社確認")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # 現時刻を取得
  date2 = dt.datetime.now().strftime(r"%Y/%m/%d")
  time2 = dt.datetime.now().strftime(r"%X")
  #
  # 読み取ったカードの持ち主の名前を取得
  df_read = pd.read_csv(id_path, header=0, index_col=None, encoding="shift jis")
  human_info = df_read[df_read["id"]==str(id_info)]
  last_name = human_info.iat[0, 1]
  full_name = human_info.iat[0, 3]
  #
  # 該当者のcsvファイルに記録
  df_rec2 = pd.read_csv(fr"{folder_path}\{full_name}.csv",
                        header=0, index_col=None, encoding="shift jis")
  df_app2 = pd.DataFrame([[date2, time2, "出"]], columns=df_rec2.columns.values)
  df_rec2 = pd.concat([df_rec2, df_app2])
  df_rec2.to_csv(fr"{folder_path}\{full_name}.csv", index=None, encoding="shift jis")
  #
  # ラベル・ボタン作成
  label2_3 = tk.Label(frame, text="読み取り完了!", font=(yu_font, 35, "bold"))
  label2_4 = tk.Label(frame, text=fr"{last_name}さん、おはようございます!",
                      font=(yu_font, 35, "bold"))
  label2_5 = tk.Label(frame, text=fr"タイムスタンプ|{time2}", font=(yu_font, 35, "bold"))
  #
  # ラベル・ボタン配置
  label2_3.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  label2_4.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  label2_5.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  #
  # 3秒後、ホーム画面へ戻る
  label2_4.after(3000, home_display)
  #
  # frameを最上面へ
  frame.tkraise()

#-------------------------------------------------------------------------------

#-----------------------------------3_1.退社確認-----------------------------------

def out_office1():
  # ウィンドウのタイトル
  root.title(r"勤怠管理ツール|退社確認")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ラベル・ボタン作成
  label3_1 = tk.Label(frame, text="退社確認", font=(yu_font, 35))
  label3_2 = tk.Label(frame, text="ICカードを置いて\r\nOKボタンを押してください",
                      font=(yu_font, 35, "bold"))
  button3_1 = tk.Button(frame, text="OK", font=(yu_font, 25, "bold"),
                        cursor=mouse, command=ic_read3)
  button3_2 = tk.Button(frame, text="ホームへ", font=(yu_font, 15),
                        cursor=mouse, command=home_display)
  #
  # ボタンのカーソル時色変更
  button3_1.bind("<Enter>", enter_bg)
  button3_1.bind("<Leave>", leave_bg)
  button3_2.bind("<Enter>", enter_bg)
  button3_2.bind("<Leave>", leave_bg)
  #
  # ラベル・ボタン配置
  label3_1.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  label3_2.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  button3_1.pack(pady=20, ipadx=20, ipady=10)
  button3_2.pack(side=tk.BOTTOM, pady=20)
  #
  # frameを最上面へ
  frame.tkraise()


def ic_read3():
  # 読み取り待機
  clf = nfc.ContactlessFrontend("usb")
  try:
    tag = clf.connect(rdwr={"targets": ["212F", "424F"],
                            "on-connect": lambda tag: False})
  finally:
    clf.close()
  #
  # タグ情報からIDmを抽出
  if tag.TYPE == "Type3Tag":
    idm = binascii.hexlify(tag.idm).decode()
  #
  # 次のフレームへ
  out_office2(idm)

#-------------------------------------------------------------------------------
#-----------------------------------3_2.退社確認-----------------------------------

def out_office2(id_info):
  # ウィンドウのタイトル
  root.title(r"勤怠管理ツール|出社確認")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # 現時刻を取得
  date3 = dt.datetime.now().strftime(r"%Y/%m/%d")
  time3 = dt.datetime.now().strftime(r"%X")
  #
  # 読み取ったカードの持ち主の名前を取得
  df_read = pd.read_csv(id_path, header=0, index_col=None, encoding="shift jis")
  human_info = df_read[df_read["id"]==str(id_info)]
  last_name = human_info.iat[0, 1]
  full_name = human_info.iat[0, 3]
  #
  # 該当者のcsvファイルに記録
  df_rec3 = pd.read_csv(fr"{folder_path}\{full_name}.csv",
                        header=0, index_col=None, encoding="shift jis")
  df_app3 = pd.DataFrame([[date3, time3, "退"]], columns=df_rec3.columns.values)
  df_rec3 = pd.concat([df_rec3, df_app3])
  df_rec3.to_csv(fr"{folder_path}\{full_name}.csv", index=None, encoding="shift jis")
  #
  # ラベル・ボタン作成
  label3_3 = tk.Label(frame, text="読み取り完了!", font=(yu_font, 35, "bold"))
  label3_4 = tk.Label(frame, text=fr"{last_name}さん、お疲れ様でした!",
                      font=(yu_font, 35, "bold"))
  label3_5 = tk.Label(frame, text=fr"タイムスタンプ|{time3}", font=(yu_font, 35, "bold"))
  #
  # ラベル・ボタン配置
  label3_3.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  label3_4.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  label3_5.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  #
  # 3秒後、ホーム画面へ戻る
  label3_4.after(3000, home_display)
  #
  # frameを最上面へ
  frame.tkraise()

#-------------------------------------------------------------------------------

#-----------------------------------4_1.メンバー登録-----------------------------------

def subscribe_member1():
  # ウィンドウのタイトル
  root.title(r"勤怠管理ツール|メンバー登録")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ラベル・ボタン作成
  label4_1 = tk.Label(frame, text="氏名を入力してください", font=(yu_font, 35, "bold"))
  label4_2 = tk.Label(frame, text="姓:", font=(yu_font, 25))
  label4_3 = tk.Label(frame, text="名:", font=(yu_font, 25))
  text4_1 = tk.Entry(frame, font=(yu_font, 20))
  text4_2 = tk.Entry(frame, font=(yu_font, 20))
  button4_1 = tk.Button(frame, text="OK", font=(yu_font, 20), cursor=mouse,
                        command=lambda: subscribe_member2(text4_1.get(),text4_2.get()))
  button4_2 = tk.Button(frame, text="ホームへ", font=(yu_font, 15), cursor=mouse,
                        command=home_display)
  #
  # ボタンのカーソル時色変更
  button4_1.bind("<Enter>", enter_bg)
  button4_1.bind("<Leave>", leave_bg)
  button4_2.bind("<Enter>", enter_bg)
  button4_2.bind("<Leave>", leave_bg)
  #
  # ラベル・ボタン配置
  label4_1.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  label4_2.place(x=200, y=200)
  text4_1.place(x=300, y=200, width=300, height=35)
  label4_3.place(x=200, y=300)
  text4_2.place(x=300, y=300, width=300, height=35)
  button4_1.place(x=350, y=400, width=100, height=50)
  button4_2.pack(side=tk.BOTTOM, pady=20)
  #
  # frameを最上面へ
  frame.tkraise()

#-------------------------------------------------------------------------------------
#-----------------------------------4_2.メンバー登録-----------------------------------

def subscribe_member2(last_name2, first_name2):
  # 名前の情報は上の関数から変数として渡す
  # ウィンドウのタイトル
  root.title(r"勤怠管理ツール|メンバー登録")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ラベル・ボタン作成
  label4_4 = tk.Label(frame, text=f"{last_name2} {first_name2}さん\r\nでよろしいでしょうか?",
                      font=(yu_font, 35, "bold"))
  button4_3 = tk.Button(frame, text="OK", font=(yu_font, 20), cursor=mouse,
                        command=lambda: subscribe_member3(last_name2, first_name2))
  button4_4 = tk.Button(frame, text="戻る", font=(yu_font, 20), cursor=mouse,
                        command=subscribe_member1)
  button4_5 = tk.Button(frame, text="ホームへ", font=(yu_font, 15), cursor=mouse,
                        command=home_display)
  #
  # ボタンのカーソル時色変更
  button4_3.bind("<Enter>", enter_bg)
  button4_3.bind("<Leave>", leave_bg)
  button4_4.bind("<Enter>", enter_bg)
  button4_4.bind("<Leave>", leave_bg)
  button4_5.bind("<Enter>", enter_bg)
  button4_5.bind("<Leave>", leave_bg)
  #
  # ラベル・ボタン配置
  label4_4.pack(side=tk.TOP, pady=60, ipadx=20, ipady=20)
  button4_3.place(x=250, y=400, width=100, height=50)
  button4_4.place(x=450, y=400, width=100, height=50)
  button4_5.pack(side=tk.BOTTOM, pady=20)
  #
  # frameを最上面へ
  frame.tkraise()

#-------------------------------------------------------------------------------------
#-----------------------------------4_3.メンバー登録-----------------------------------

def subscribe_member3(last_name3, first_name3):
  # ウィンドウのタイトル
  root.title(r"勤怠管理ツール|メンバー登録")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ラベル・ボタン作成
  label4_5 = tk.Label(frame, text="氏名を登録しました!", font=(yu_font, 35, "bold"))
  label4_6 = tk.Label(frame, text="ICカードを置いて\r\nOKボタンを押してください",
                      font=(yu_font, 35, "bold"))
  button4_6 = tk.Button(frame, text="OK", font=(yu_font, 25, "bold"), cursor=mouse,
                        command=lambda: ic_read4(last_name3, first_name3))
  button4_7 = tk.Button(frame, text="ホームへ", font=(yu_font, 15), cursor=mouse,
                        command=home_display)
  #
  # ボタンのカーソル時色変更
  button4_6.bind("<Enter>", enter_bg)
  button4_6.bind("<Leave>", leave_bg)
  button4_7.bind("<Enter>", enter_bg)
  button4_7.bind("<Leave>", leave_bg)
  #
  # ラベル・ボタン配置
  label4_5.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  label4_6.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  button4_6.pack(pady=20, ipadx=20, ipady=10)
  button4_7.pack(side=tk.BOTTOM, pady=20)
  #
  # frameを最上面へ
  frame.tkraise()


def ic_read4(last, first):
  # 読み取り待機
  clf = nfc.ContactlessFrontend("usb")
  try:
    tag = clf.connect(rdwr={"targets": ["212F", "424F"],
                            "on-connect": lambda tag: False})
  finally:
    clf.close()
  #
  # タグ情報からIDmを抽出
  if tag.TYPE == "Type3Tag":
    idm = binascii.hexlify(tag.idm).decode()
  #
  # idmの重複確認 > 重複していたらエラー画面|重複していなければ記録
  df_rec4 = pd.read_csv(id_path, header=0, index_col=None, encoding="shift jis")
  id_conf = df_rec4[df_rec4["id"]==idm]
  if id_conf.size > 0:
    # 重複している > エラー画面
    subscribe_error(last, first)
  else:
    # 重複していない > id_name.csvに登録者の情報を記録
    date4 = dt.datetime.now().strftime(r"%Y/%m/%d")
    time4 = dt.datetime.now().strftime(r"%X")
    df_app4 = pd.DataFrame([[f"{date4} {time4}", last, first, last + first, idm]],
                           columns=df_rec4.columns.values)
    df_rec4 = pd.concat([df_rec4, df_app4])
    df_rec4.to_csv(id_path, index=None, encoding="shift jis")
    #
    # 登録者のcsvファイルを作成
    df_make = pd.DataFrame([[None]*3], columns=["日付", "時間", "出/退"])
    df_make = df_make.drop([0])
    df_make.to_csv(fr"{folder_path}\{last}{first}.csv",
                   index=None, encoding="shift jis")
    #
    # 次のフレームへ
    subscribe_member4(last)

#-------------------------------------------------------------------------------------
#-----------------------------------4_4.メンバー登録-----------------------------------

def subscribe_member4(name):
  # ウィンドウのタイトル
  root.title(r"勤怠管理ツール|メンバー登録")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ラベル・ボタン作成
  label4_7 = tk.Label(frame, text="ICカードを登録しました!", font=(yu_font, 35, "bold"))
  label4_8 = tk.Label(frame, text=f"{name}さんよろしくお願いします!",
                      font=(yu_font, 35, "bold"))
  #
  # ラベル・ボタン配置
  label4_7.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  label4_8.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  #
  # 3秒後、ホーム画面へ戻る
  label4_8.after(3000, home_display)
  #
  # frameを最上面へ
  frame.tkraise()


# id情報重複エラー画面
def subscribe_error(last_name4, first_name4):
  # ウィンドウのタイトル
  root.title(r"勤怠管理ツール|メンバー登録")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ラベル・ボタン作成
  label4_9 = tk.Label(frame, text="ID情報が重複しています", font=(yu_font, 35, "bold"))
  label4_10 = tk.Label(frame, text="もう一度やり直してください",
                       font=(yu_font, 35, "bold"))
  #
  # ラベル・ボタン配置
  label4_9.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  label4_10.pack(side=tk.TOP, pady=20, ipadx=20, ipady=20)
  #
  # 2秒後、前の画面へ戻る
  label4_10.after(2000, lambda: subscribe_member3(last_name4, first_name4))
  #
  # frameを最上面へ
  frame.tkraise()

#-------------------------------------------------------------------------------------

#-----------------------------------基本設定-----------------------------------

# メインウィンドウ作成
root = tk.Tk()

# ウィンドウ内のエリア変化率を等倍に指定
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

# ウィンドウの大きさを決定
root.minsize(width=800, height=700)
root.maxsize(width=800, height=700)

# 使用したいフォント
yu_font = "游ゴシック"

# ボタンにカーソルが乗ったときの色
def enter_bg(event):
  event.widget["bg"] = "#D3D3D3"

# ボタンからカーソルが離れたときの色
def leave_bg(event):
  event.widget["bg"] = "SystemButtonFace"

# マウスカーソル時のポイント変更
mouse = "hand2"


# フォルダ・ファイルのパス
folder_path = r"C:\User\Owner\Documents\kintai"
id_path = fr"{folder_path}\id_name.csv"

# id_name.csvが無ければ作成
if os.path.exists(id_path) == False:
  # id_name.csvファイルのテンプレート作成
  df_temp = pd.DataFrame([[None]*5],
                         columns=["time", "last_name", "first_name", "full_name", "id"])
  df_temp = df_temp.drop([0])
  #
  # id_name.csvファイルを作成
  df_temp.to_csv(id_path, index=None, encoding="shift jis")

#-----------------------------------------------------------------------------

home_display()

root.mainloop()

【Python入門🔰】class(クラス)を作って使ってみよう

class を作って使う

class SelfIntroduction:
  # コンストラクタ生成
  def __init__(self):
    self.company = ""
    self.name = ""
    self.hobby = ""
    self.end = "よろしくお願いします!"
  
  # 自己紹介
  def introduce(self):
    print(f"{self.company}から来ました {self.name} です。",
          f"\n\r趣味は {self.hobby} です。",
          f"\n\r{self.end}"
    )
  

# インスタンス生成
ichiro = SelfIntroduction()
mike = SelfIntroduction()
kevin = SelfIntroduction()

# Ichiro Info
ichiro.company = "日本"
ichiro.name = "一郎"
ichiro.hobby = "けん玉"

# Mike Info
mike.company = "アメリカ"
mike.name = "マイク"
mike.hobby = "野球"

# Kevin Info
kevin.company = "イギリス"
kevin.name = "ケビン"
kevin.hobby = "テニス"


# メソッド実行:Ichiro
ichiro.introduce()
"""出力結果
日本から来ました 一郎 です。
趣味は けん玉 です。
よろしくお願いします!
"""

# メソッド実行:Mike
mike.introduce()
"""出力結果
アメリカから来ました マイク です。
趣味は 野球 です。
よろしくお願いします!
"""

# メソッド実行:Kevin
kevin.introduce()
"""出力結果
イギリスから来ました ケビン です。
趣味は テニス です。
よろしくお願いします!
"""

# 最後の言葉を変える
ichiro.end = "以後お見知りおきを。"
ichiro.introduce()
"""出力結果
日本から来ました 一郎 です。
趣味は けん玉 です。
以後お見知りおきを。
"""

【tkinter】ツールやアプリを作るための色々なウィジェット

簡単なツール作成:四則演算ツール

import tkinter as tk
from decimal import Decimal


#----------------------------------最初のフレーム----------------------------------

# フレーム作成
def home_frame():
  # ウィンドウのタイトル指定
  root.title("四則演算ツール")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ウィジェット作成
  lbl = tk.Label(frame, text="四則演算ツール", font=(yu_font, 30))
  btn1_1 = tk.Button(frame, text="足し算", font=(yu_font, 20),
                     command=addition)
  btn1_2 = tk.Button(frame, text="引き算", font=(yu_font, 20),
                     command=subtraction)
  btn1_3 = tk.Button(frame, text="掛け算", font=(yu_font, 20),
                     command=multiplication)
  btn1_4 = tk.Button(frame, text="割り算", font=(yu_font, 20),
                     command=division)
  #
  # ウィジェット配置
  lbl.place(x=270, y=50)
  btn1_1.place(x=150, y=180, width=200, height=100)
  btn1_2.place(x=450, y=180, width=200, height=100)
  btn1_3.place(x=150, y=350, width=200, height=100)
  btn1_4.place(x=450, y=350, width=200, height=100)
  #
  # フレームを最上面へ
  frame.tkraise()
  #

#-----------------------------------------------------------------------------------

#----------------------------------足し算のフレーム----------------------------------

# フレーム作成
def addition():
  # ウィンドウのタイトル指定
  root.title("四則演算ツール|足し算")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ウィジェット作成
  lbl_1 = tk.Label(frame, text="足し算", font=(yu_font, 30))
  box_1 = tk.Entry(frame, font=(yu_font, 15))
  lbl_2 = tk.Label(frame, text="+", font=(yu_font, 30))
  lbl_3 = tk.Label(frame, text="⇓", font=(yu_font, 30))
  box_2 = tk.Entry(frame, font=(yu_font, 15))
  box_3 = tk.Entry(frame, font=(yu_font, 15))
  btn = tk.Button(frame, text="計算", font=(yu_font, 20),
                  command=lambda: box_3.insert(tk.END,str(func_1(box_3,box_1.get(),box_2.get()))))
  back = tk.Button(frame, text="ホームへ", command=home_frame)
  #
  # ウィジェット配置
  lbl_1.place(x=300, y=50, width=200, height=40)
  box_1.place(x=100, y=150, width=200, height=40)
  lbl_2.place(x=375, y=150, width=50, height=40)
  lbl_3.place(x=375, y=230, width=50, height=40)
  box_2.place(x=500, y=150, width=200, height=40)
  box_3.place(x=300, y=300, width=200, height=40)
  btn.place(x=350, y=400, width=100, height=50)
  back.place(x=370, y=460, width=60, height=30)
  #
  # フレームを最上面へ
  frame.tkraise()
  #


# 足し算
def func_1(arg1, arg2, arg3):
  dele = arg1.delete(0, tk.END)
  calc = Decimal(arg2) + Decimal(arg3)
  return calc


#-----------------------------------------------------------------------------------

#----------------------------------引き算のフレーム----------------------------------

# フレーム作成
def subtraction():
  # ウィンドウのタイトル指定
  root.title("四則演算ツール|引き算")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ウィジェット作成
  lbl_1 = tk.Label(frame, text="引き算", font=(yu_font, 30))
  box_1 = tk.Entry(frame, font=(yu_font, 15))
  lbl_2 = tk.Label(frame, text="-", font=(yu_font, 30))
  lbl_3 = tk.Label(frame, text="⇓", font=(yu_font, 30))
  box_2 = tk.Entry(frame, font=(yu_font, 15))
  box_3 = tk.Entry(frame, font=(yu_font, 15))
  btn = tk.Button(frame, text="計算", font=(yu_font, 20),
                  command=lambda: box_3.insert(tk.END,str(func_2(box_3,box_1.get(),box_2.get()))))
  back = tk.Button(frame, text="ホームへ", command=home_frame)
  #
  # ウィジェット配置
  lbl_1.place(x=300, y=50, width=200, height=40)
  box_1.place(x=100, y=150, width=200, height=40)
  lbl_2.place(x=375, y=150, width=50, height=40)
  lbl_3.place(x=375, y=230, width=50, height=40)
  box_2.place(x=500, y=150, width=200, height=40)
  box_3.place(x=300, y=300, width=200, height=40)
  btn.place(x=350, y=400, width=100, height=50)
  back.place(x=370, y=460, width=60, height=30)
  #
  # フレームを最上面へ
  frame.tkraise()
  #


# 引き算
def func_2(arg1, arg2, arg3):
  dele = arg1.delete(0, tk.END)
  calc = Decimal(arg2) - Decimal(arg3)
  return calc


#-----------------------------------------------------------------------------------

#----------------------------------掛け算のフレーム----------------------------------

# フレーム作成
def multiplication():
  # ウィンドウのタイトル指定
  root.title("四則演算ツール|掛け算")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ウィジェット作成
  lbl_1 = tk.Label(frame, text="掛け算", font=(yu_font, 30))
  box_1 = tk.Entry(frame, font=(yu_font, 15))
  lbl_2 = tk.Label(frame, text="×", font=(yu_font, 30))
  lbl_3 = tk.Label(frame, text="⇓", font=(yu_font, 30))
  box_2 = tk.Entry(frame, font=(yu_font, 15))
  box_3 = tk.Entry(frame, font=(yu_font, 15))
  btn = tk.Button(frame, text="計算", font=(yu_font, 20),
                  command=lambda: box_3.insert(tk.END,str(func_3(box_3,box_1.get(),box_2.get()))))
  back = tk.Button(frame, text="ホームへ", command=home_frame)
  #
  # ウィジェット配置
  lbl_1.place(x=300, y=50, width=200, height=40)
  box_1.place(x=100, y=150, width=200, height=40)
  lbl_2.place(x=375, y=150, width=50, height=40)
  lbl_3.place(x=375, y=230, width=50, height=40)
  box_2.place(x=500, y=150, width=200, height=40)
  box_3.place(x=300, y=300, width=200, height=40)
  btn.place(x=350, y=400, width=100, height=50)
  back.place(x=370, y=460, width=60, height=30)
  #
  # フレームを最上面へ
  frame.tkraise()
  #


# 掛け算
def func_3(arg1, arg2, arg3):
  dele = arg1.delete(0, tk.END)
  calc = Decimal(arg2) * Decimal(arg3)
  return calc


#-----------------------------------------------------------------------------------

#----------------------------------割り算のフレーム----------------------------------

# フレーム作成
def division():
  # ウィンドウのタイトル指定
  root.title("四則演算ツール|割り算")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ウィジェット作成
  lbl_1 = tk.Label(frame, text="割り算", font=(yu_font, 30))
  box_1 = tk.Entry(frame, font=(yu_font, 15))
  lbl_2 = tk.Label(frame, text="÷", font=(yu_font, 30))
  lbl_3 = tk.Label(frame, text="⇓", font=(yu_font, 30))
  box_2 = tk.Entry(frame, font=(yu_font, 15))
  box_3 = tk.Entry(frame, font=(yu_font, 15))
  btn = tk.Button(frame, text="計算", font=(yu_font, 20),
                  command=lambda: box_3.insert(tk.END,str(func_4(box_3,box_1.get(),box_2.get()))))
  back = tk.Button(frame, text="ホームへ", command=home_frame)
  #
  # ウィジェット配置
  lbl_1.place(x=300, y=50, width=200, height=40)
  box_1.place(x=100, y=150, width=200, height=40)
  lbl_2.place(x=375, y=150, width=50, height=40)
  lbl_3.place(x=375, y=230, width=50, height=40)
  box_2.place(x=500, y=150, width=200, height=40)
  box_3.place(x=300, y=300, width=200, height=40)
  btn.place(x=350, y=400, width=100, height=50)
  back.place(x=370, y=460, width=60, height=30)
  #
  # フレームを最上面へ
  frame.tkraise()
  #


# 割り算
def func_4(arg1, arg2, arg3):
  dele = arg1.delete(0, tk.END)
  calc = Decimal(arg2) / Decimal(arg3)
  return calc


#-----------------------------------------------------------------------------------

#---------------------------------------設定---------------------------------------

# ウィンドウ作成
root = tk.Tk()

# ウィンドウの大きさを固定
root.minsize(width=800, height=500)
root.maxsize(width=800, height=500)

# ウィンドウ内部のエリア変化率を1:1に固定
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

# フォント指定
yu_font = "游ゴシック"

#-----------------------------------------------------------------------------------

home_frame()

root.mainloop()

【PyPDF2】PythonでPDFを操作してみよう【結合・分割・回転】

PDFの結合

import PyPDF2 as pp2
import glob

# PDFファイルが入っているフォルダのパス
path = r"C:\Users\owner\pdf_folder"

# フォルダ内の全PDFファイルを読み込み
pdf_list = glob.glob(fr"{path}\*.pdf")

# 結合機能を呼び出し
merger = pp2.PdfMerger()

# ループで全PDFファイルを結合機能へ格納
for pdf in pdf_list:
  merger.append(pdf)

# 結合して保存する
merger.write(fr"{path}\merged.pdf")

# 結合機能を閉じる
merger.close()

PDFの分割

import PyPDF2 as pp2

# PDFファイルが入っているフォルダのパス
path = r"C:\Users\owner\pdf_folder"

# フォルダ内のPDFファイル(4ページ)を読み込み
reader = pp2.PdfReader(fr"{path}\pdf-input.pdf")

# ループを使って、各ページをPDFファイルとして出力
# len(reader.pages)→読み込んだPDFファイルの総ページ数
for pages in range(len(reader.pages)):
  # 新しいPDFの格納先を作成 兼 リセット
  writer = pp2.PdfWriter()
  # 格納先にPDFファイルの1ページを追加
  writer.add_page(reader.pages[pages])
  # "wb"を指定して新しいファイルとして保存&with open()によって自動的にcloseさせる
  with open(fr"{path}\split_{str(pages)}.pdf", "wb") as fp:
    writer.write(fp)

PDFの回転

import PyPDF2 as pp2

# PDFファイルが入っているフォルダのパス
path = r"C:\Users\owner\pdf-folder"

# フォルダ内のPDFファイルを読み込み
reader = pp2.PdfReader(fr"{path}\pdf-input.pdf")

# 新しいPDFの格納先を作成
writer = pp2.PdfWriter()

# ループで全ページを格納先に追加
for pages in reader.pages:
  writer.add_page(pages)

# 1ページ目を右に90度回転させる
rotate_right = writer.pages[0].rotate(90)

# "wb"を指定して新しいファイルとして保存&with open()によって自動的にcloseさせる
with open(fr"{path}\rotated.pdf", "wb") as fp:
  writer.write(fp)

【tkinter】PythonでYouTubeの動画をダウンロードするGUIアプリ作成

yt_dl_gui.py

import tkinter as tk
from pytube import YouTube
import threading


#----------------------------------1枚目のフレーム----------------------------------

# 1枚目のフレーム作成
def downloader_1():
  # ウィンドウのタイトル指定
  root.title("Youtube Downloader")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ウィジェット作成
  lbl1_1 = tk.Label(frame, text="URLを入力してください", font=(yu_font, 30))
  txtbox1_1 = tk.Entry(frame, font=(yu_font, 15))
  btn1_1 = tk.Button(frame, text="実行", font=(yu_font, 20), cursor=mouse,
                     command=lambda: downloader_2(txtbox1_1.get()))
  #
  # ホバー時にボタンの色を変更
  btn1_1.bind("<Enter>", enter_bg)
  btn1_1.bind("<Leave>", leave_bg)
  #
  # ウィジェット配置
  lbl1_1.place(x=180, y=150)
  txtbox1_1.place(x=100, y=300, width=450, height=35)
  btn1_1.place(x=600, y=300, width=100, height=35)
  #
  # フレームを最上面へ
  frame.tkraise()
  #

#-----------------------------------------------------------------------------------
#----------------------------------2枚目のフレーム----------------------------------

# 2枚目のフレーム作成
def downloader_2(url):
  # ウィンドウのタイトル指定
  root.title("Youtube Downloader")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ウィジェット作成
  lbl2_1 = tk.Label(frame, text="動画をダウンロードしています...", font=(yu_font, 30))
  #
  # ウィジェット配置
  lbl2_1.place(x=80, y=200)
  #
  # ラベルを表示した5秒後に、3枚目へ進む
  lbl2_1.after(5000, downloader_3)
  #
  # 並列処理の命令
  thr2_1 = threading.Thread(target=frame.tkraise)
  thr2_2 = threading.Thread(target=YouTube(str(url)).streams.get_highest_resolution().download)
  #
  # フレームを最上面へ
  thr2_1.start()
  #
  # 動画のダウンロード
  thr2_2.start()
  #

#-----------------------------------------------------------------------------------
#----------------------------------3枚目のフレーム----------------------------------

# 3枚目のフレーム作成
def downloader_3():
  # ウィンドウのタイトル指定
  root.title("Youtube Downloader")
  #
  # フレーム作成
  frame = tk.Frame(root)
  frame.grid(row=0, column=0, sticky=tk.NSEW)
  #
  # ウィジェット作成
  lbl3_1 = tk.Label(frame, text="ダウンロードが完了しました", font=(yu_font, 30))
  lbl3_2 = tk.Label(frame, text="最初のページに戻ります", font=(yu_font, 15))
  #
  # ウィジェット配置
  lbl3_1.place(x=130, y=200)
  lbl3_2.place(x=280, y=350)
  #
  # 3秒後、1枚目に戻る
  lbl3_1.after(3000, downloader_1)
  #
  # フレームを最上面へ
  frame.tkraise()
  #

#-----------------------------------------------------------------------------------
#------------------------------------初期設定------------------------------------

# ウィンドウ作成
root = tk.Tk()

# ウィンドウの大きさを固定
root.minsize(width=800, height=500)
root.maxsize(width=800, height=500)

# ウィンドウ内部のエリア変化率を1:1に固定
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

# フォント指定
yu_font = "游ゴシック"

# ボタンにカーソルが乗ったときの色指定
def enter_bg(event):
  event.widget["bg"] = "#D3D3D3"

# ボタンからカーソルが離れたときの色指定
def leave_bg(event):
  event.widget["bg"] = "SystemButtonFace"

# マウスホバー時のカーソル変更
mouse = "hand2"

#-----------------------------------------------------------------------------------

downloader_1()

root.mainloop()

【nfcpy & PaSoRi】PythonでICカードのIDmを読み取ってみよう

read_idm.py

import nfc
import binascii

# ICカードの待機
clf = nfc.ContactlessFrontend("usb")
print("カードをかざしてください:")
try:
  tag = clf.connect(rdwr={"on-connect": lambda tag: False})
finally:
  clf.close()

# ICカードのID情報抽出して表示する
if tag.TYPE == 'Type3Tag':
  id_info = binascii.hexlify(tag.idm).decode()
elif tag.TYPE == 'Type4Tag':
  id_info = binascii.hexlify(tag.identifier).decode()

print("IDm:" + id_info)

【pytube】YouTubeの動画をダウンロードする方法

YouTubeの動画をダウンロードする

from pytube import YouTube

url = "ここに動画のURLを貼り付け"
YouTube(url).streams.get_highest_resolution().download()
タイトルとURLをコピーしました