前提・実現したいこと
このサイト をもとに、tkinterとwebbrowserで作る出退勤アプリをカスタマイズしています。
今回は、ボタンの表示を曜日によって表示切替したいです。
試したこと
調べてみて、以下の2点はわかりました
・ボタンを非表示にするのは、button.pack_forget()であること
・if文で、datetime.date.today().weekday()を使って、曜日を判定すること
そこで、これを使って以下のソースを書き換えたいのですが、以下2点が
・ボタンはfor~in list:で生成されているので、button.pack(略)の下の行にbutton.pack_forget()を追記するとすべてのボタンが消えてしまう
→表示切替をしたいのは、ボタンAとBのみ
・if文に表示切替の処理を書きたい(が書き方がわからない)
→ifを使ってラベルのテキスト(変数WD)を曜日で書き換えることはできたのですが、これのようにボタンも切り替えできそうかな、と予想しているのですが、無理でしょうか?
初心者すぎて全然わからないので、ほかにいいやり方がありそうなら、ほかのやり方でも全然かまわないです。
自分なりに調べてはみましたが、お手上げ状態なので、助けていただけるとうれしいです。
該当のソースコード
python.py
1 2import pyperclip 3import winsound 4import tkinter as tk 5from tkinter import Pack, ttk 6import webbrowser 7import calendar 8import datetime 9 10 11#起動時に音を再生 12winsound.Beep(1000, 300) # 1000Hzのビープを300ms再生 13 14''' 15曜日判定 16 17月 火 水 木 金 土 日 180 1 2 3 4 5 6 19''' 20 21#曜日を判定 22#金曜以外の時 →ボタンAを表示、ボタンBを非表示したい 23#金曜の時 →ボタンBを表示、ボタンAを非表示したい 24 25WD = "" #label表示用変数 26 27weekday = datetime.date.today().weekday() 28#print(weekday) 29if weekday == 4: 30 print("今日は金曜です") 31 WD = "※今日は金曜です※" 32 # ここにボタンBを表示してAを非表示にする処理? 33 34 35else: 36 print("金曜以外") 37 WD = "" 38 # ここにボタンAを表示してBを表示にする処理? 39 40 41#曜日判定ここまで 42 43 44class ShortCutButton(ttk.Button): 45 ''' 46 登録したurlをブラウザで開くボタンを生成 47 clipwordを登録すると、登録した文字をクリップボードにコピーする 48 ''' 49 50 def __init__(self, title, url, clipword=None, master=None): 51 super().__init__(master, width=15, text=title, command=self.button_clicked) 52 self.url = url 53 self.clipword = clipword 54 55 56 def button_clicked(self): 57 if self.clipword: 58 pyperclip.copy(self.clipword) # clipwordをコピー 59 60 if self.url: 61 webbrowser.open(self.url) # urlをブラウザで開く 62 root.destroy() 63 64 65 66 67 68 69if __name__ == '__main__': 70 #ボタン、url、コピーする文字列のリスト 71 # group を追加しました。これはグループ化するかしないかを判別する文字列です。 72 # groupが同じ文字列の項目が連続している場合、横並びになります。 73 word_list = [ 74 { 75 "group": None, 76 "buttonInfo": [ 77 "出勤", 78 "ここにURL", 79 "出勤します" 80 ] 81 }, 82 { 83 "group": "SmallBtn", 84 "buttonInfo": [ 85 "in休憩", 86 "ここにURL", 87 "休憩いただきます。" 88 ] 89 }, 90 { 91 "group": "SmallBtn", 92 "buttonInfo": [ 93 "out休憩", 94 "ここにURL", 95 "只今休憩より戻りました。" 96 ], 97 }, 98 { 99 ###### ボタンA 月~木のみ表示したい。 金曜日は非表示にしたい 100 "group": None, 101 "buttonInfo": [ 102 "退勤", 103 "ここにURL", 104 "明日もよろしくお願いいたします", 105 ] 106 }, 107 { 108 ###### ボタンB 金曜日だけ表示したい。 金曜以外は非表示にしたい 109 "group": None, 110 "buttonInfo": [ 111 "退勤(金)", 112 "ここにURL", 113 "来週もよろしくお願いいたします", 114 ], 115 } 116 ] 117 118 root = tk.Tk() 119 120 root.title('お時間ですよ') 121 root.geometry('500x300+500+300') 122 root.attributes("-topmost", True) 123 124 message = tk.Message(root, text=WD, font=("MyricaM M", 20), fg='#ff0000', width=500) 125 message.pack(fill=tk.BOTH) 126 127 128 129 130 131 #ボタンを生成 132 last_group = None # 今グループ化しているグループ名 133 for info in word_list: 134 if info["group"] == None: 135 last_group = None 136 parent = root 137 pack_side = tk.TOP 138 139 140 elif info["group"] != last_group: 141 # 新しいFrameを作ってその中では左から詰めていくように設定する。 142 last_group = info["group"] 143 #print(f'grouped {info["group"]}') 144 parent = tk.Frame(root) 145 parent.pack(expand=True, fill=tk.BOTH) # fillしておかないとボタンが小さくなる 146 pack_side = tk.LEFT # ボタンの左詰め(左から右へ)を指定 147 148 149 150 button = ShortCutButton(master=parent, *info["buttonInfo"]) 151 button.pack(expand=1, fill=tk.BOTH, padx=10, 152 pady=10, side=pack_side) 153 154 # 試したこと 155 # ここにbutton.pack_forget()を書けば、ボタンは消えるが、すべてのボタンが消えてしまう。 156 157 158 root.mainloop() 159
###追記・試したこと
まず、Pythonのtkinterで二つのボタンを作成し、
片方は金曜日のみ表示されるボタン、もう片方は金曜日以外の日にのみ表示されるボタンにしようと思いましたが、これもうまくいきませんでした
calenderとdatetimeを使って、ifで、金曜日かそれ以外かを判断する
それぞれのボタンを条件によって、buttonFri.pack_forget()で非表示にしたいので、
変数switchBtnFri、switchBtnNoFriを作って、そこにbuttonFri.pack_forget()の処理を入れたらうまくいくかと思ったのですが、だめでした
単純に=で入れたら(たぶん)文字列になってしまって、buttonFri.pack_forget()されない
どうしたらいいでしょうか?
test.py
1 2import tkinter as tk 3import calendar 4import datetime 5 6''' 7曜日判定 8 9月 火 水 木 金 土 日 100 1 2 3 4 5 6 11''' 12 13#曜日を用意 14switchBtnFri = "" 15switchBtnNoFri = "" 16weekday = datetime.date.today().weekday() 17#print(weekday) 18if weekday == 4: 19 #print("今日は金曜です") 20 switchBtnFri = "" 21 switchBtnNoFri = "buttonNoFri.pack_forget()" 22else: 23 #print("金曜以外") 24 switchBtnFri = "buttonFri.pack_forget()" 25 switchBtnNoFri = "" 26 27#windowを表示 28root = tk.Tk() 29 30#金曜日のボタン 31buttonFri = tk.Button(root, text='金曜日のボタン') 32buttonFri.pack() 33#buttonFri.pack_forget() # この文を直接書けばボタンは非表示になる 34switchBtnFri # が、変数switchBtnFriにbuttonFri.pack_forget() を代入?してボタンを消したいが、文字列として代入されてしまう? 35print(switchBtnFri) #コンソールにbuttonFri.pack_forget()が出力されるので、switchBtnFriにbuttonFri.pack_forget()は入っていそうなのに、ボタンが非表示になるわけではない→文字列として代入されているのかな?だから非表示にならないのかな? 36 37#金曜日以外のボタン 38buttonNoFri = tk.Button(root, text='金曜日以外のボタン') 39buttonNoFri.pack() 40switchBtnNoFri #この変数も同じ 41 42root.mainloop()
補足情報(FW/ツールのバージョンなど)
OS windows10
Python 3.9
使用ソフト vscode
あなたの回答
tips
プレビュー