質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1414閲覧

checkbox一つにチェックをつけると全てについてしまう

momey0709

総合スコア5

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/11 20:21

編集2020/09/11 20:22

for文でcheckboxを複数packしているが、
一つのチェックをつけると
全てチェックされてしまう。
何故なんでしょうか
全コードは下記で、

python

1# -*- coding:utf-8 -*- 2 3import tkinter as tk 4import datetime 5import re 6import sqlite3 7 8 9class mycalendar(tk.Frame): 10 def __init__(self, master=None, cnf={}, **kw): 11 tk.Frame.__init__(self, master, cnf, **kw) 12 13 now = datetime.datetime.now() 14 15 self.year = now.year 16 self.month = now.month 17 self.today = now.day 18 global YEAR, MONTH 19 YEAR = str(self.year) 20 MONTH = str(self.month) 21 22 frame_top = tk.Frame(self) 23 frame_top.pack(pady=5) 24 25 self.current_year = tk.Label(frame_top, text="{}年".format(self.year), font=("", 18)) 26 self.current_year.pack(side="left") 27 self.current_month = tk.Label(frame_top, text="{}月".format(self.month), font=("", 18)) 28 self.current_month.pack(side="left") 29 30 frame_week = tk.Frame(self) 31 frame_week.pack() 32 button_mon = d_button(frame_week, text="月") 33 button_mon.grid(column=0, row=0) 34 button_tue = d_button(frame_week, text="火") 35 button_tue.grid(column=1, row=0) 36 button_wed = d_button(frame_week, text="水") 37 button_wed.grid(column=2, row=0) 38 button_thu = d_button(frame_week, text="木") 39 button_thu.grid(column=3, row=0) 40 button_fri = d_button(frame_week, text="金") 41 button_fri.grid(column=4, row=0) 42 button_sta = d_button(frame_week, text="土", fg="blue") 43 button_sta.grid(column=5, row=0) 44 button_san = d_button(frame_week, text="日", fg="red") 45 button_san.grid(column=6, row=0) 46 47 self.frame_calendar = tk.Frame(self) 48 self.frame_calendar.pack() 49 50 self.create_calendar(self.year, self.month) 51 52 def create_calendar(self, year, month): 53 54 try: 55 for key, item in self.day.items(): 56 item.destroy() 57 except: 58 pass 59 60 import calendar 61 cal = calendar.Calendar() 62 days = cal.monthdayscalendar(year, month) 63 64 self.day = {} 65 for i in range(0, 42): 66 c = i - (7 * int(i / 7)) 67 r = int(i / 7) 68 try: 69 if days[r][c] != 0: 70 if days[r][c] == self.today: 71 self.day[i] = d_button(self.frame_calendar, text=days[r][c], fg="magenta") 72 else: 73 self.day[i] = d_button(self.frame_calendar, text=days[r][c]) 74 self.day[i].grid(column=c, row=r) 75 self.day[i].bind("<ButtonPress>", self.createNewWindow) 76 except: 77 """ 78 月によっては、i=41まで日付がないため、日付がないiのエラー回避が必要 79 """ 80 break 81 82 def change_month(self, event): 83 if event.widget["text"] == "<": 84 self.month -= 1 85 else: 86 self.month += 1 87 if self.month == 0: 88 self.year -= 1 89 self.month = 12 90 elif self.month == 13: 91 self.year += 1 92 self.month = 1 93 self.current_year["text"] = self.year 94 self.current_month["text"] = self.month 95 self.create_calendar(self.year, self.month) 96 97 def createNewWindow(self,event): 98 self.newWindow = tk.Toplevel(root) 99 self.app = Win2(self.newWindow,event) 100 101class d_button(tk.Button): 102 def __init__(self, master=None, cnf={}, **kw): 103 tk.Button.__init__(self, master, cnf, **kw) 104 self.configure(font=("", 14), height=2, width=4, relief="flat") 105 106class Win2(tk.Frame): 107 def __init__(self,master,event): 108 super().__init__(master) 109 self.pack() 110 self.master.geometry("500x500") 111 self.master.title("{}日".format(event.widget["text"])) 112 self.day = event.widget["text"] 113 self.today_schedule() 114 self.create_text() 115 self.create_addbtn() 116 self.create_delbtn() 117 self.create_clsbtn() 118 119 def today_schedule(self): 120 now = datetime.datetime.now() 121 self.year = now.year 122 self.month = now.month if len(str(now.month)) == 2 else "0{}".format(now.month) 123 self.yymmdd = "{}-{}-{}".format(self.year, self.month, self.day) 124 self.dbfile = sqlite3.connect('schedule.db') 125 self.sql = self.dbfile.cursor() 126 self.sql.execute("select * from cl_table where YYYYMMDD = ? ORDER BY HHMMSS ASC", (self.yymmdd, )) 127 list = self.sql.fetchall() 128 i = 0 129 self.list_chk = [] 130 self.list_time = [] 131 self.list_memo = [] 132 bln = tk.BooleanVar() 133 bln.set(False) 134 if not len(list) == 0: 135 for out in list: 136 self.ddmm = tk.Checkbutton(self.master, text="{} {}".format(out[1],out[2]), variable=bln) 137 self.list_chk.append(bln) 138 self.ddmm.place(x=180, y=i) 139 i = i + 20 140 self.list_time.append(out[1]) 141 self.list_memo.append(out[2]) 142 else: 143 self.notinfo = tk.Label(self.master, text="今日の予定はありません") 144 self.notinfo.pack() 145 146 def create_text(self): 147 self.time_label = tk.Label(self.master, text="時刻") 148 self.time_input = tk.Entry(self.master, width=20) 149 self.schedule_label = tk.Label(self.master, text="予定") 150 self.schedule_input = tk.Entry(self.master, width=40) 151 self.time_label.place(x=50, y=250) 152 self.time_input.place(x=100, y=250) 153 self.schedule_label.place(x=50, y=300) 154 self.schedule_input.place(x=100, y=300) 155 156 def create_addbtn(self): 157 self.button_commit = tk.Button(self.master, text="登録", fg="green", command=self.schedule_adding) 158 self.button_commit.place(x=420, y=450) 159 160 def schedule_adding(self): 161 self.time = self.time_input.get() 162 self.memo = self.schedule_input.get() 163 self.result = self.time_invalid() 164 self.msg_label = tk.Label(self.master, text=" ") 165 self.msg_label.place(x=200, y=350) 166 167 if self.result and not len(self.memo) == 0: 168 self.sql.execute("INSERT INTO cl_table VALUES (?,?,?)",[self.yymmdd, self.time, self.memo]) 169 self.dbfile.commit() 170 self.msg_label = tk.Label(self.master, text="予定が登録されました", fg="green") 171 self.msg_label.place(x=150, y=350) 172 else: 173 self.worning_message() 174 175 def time_invalid(self): 176 if re.fullmatch(r'\d{2}:\d{2}', self.time): 177 return True 178 else: 179 return False 180 181 def worning_message(self): 182 if self.result: 183 self.msg_label = tk.Label(self.master, text="予定を入力してください", fg="red") 184 else: 185 self.msg_label = tk.Label(self.master, text="時刻は 「XX:XX」の形式で入力してください", fg="red") 186 self.msg_label.place(x=150, y=350) 187 188 def create_delbtn(self): 189 # Button 190 self.button_quit = tk.Button(self.master, text="削除", command=self.schedule_deleting, fg="red") 191 self.button_quit.place(x=290, y=450) 192 193 def schedule_deleting(self): 194 self.delete_tergets = self.list_chk 195 self.delete_times = self.list_time 196 self.delete_memos = self.list_memo 197 self.msg_label = tk.Label(self.master, text=" ") 198 self.msg_label.place(x=200, y=350) 199 i = 0 200 for terget, time, memo in zip(self.delete_tergets, self.delete_times, self.delete_memos): 201 if terget.get() == True: 202 self.sql.execute("delete from cl_table where YYYYMMDD = ? and HHMMSS = ? and memo = ?",(self.yymmdd, time, memo)) 203 i = i + 1 204 self.dbfile.commit() 205 else: 206 continue 207 else: 208 if i == 0: 209 self.msg_label = tk.Label(self.master, text="削除したい予定にチェックを入れてください", fg="red") 210 else: 211 self.msg_label = tk.Label(self.master, text="削除が完了しました", fg="green") 212 self.msg_label.place(x=150, y=350) 213 214 def create_clsbtn(self): 215 self.button_quit = tk.Button(self.master, text="閉じる", command=self.quit_window) 216 self.button_quit.place(x=350, y=450) 217 218 def quit_window(self): 219 self.master.destroy() 220 221root = tk.Tk() 222root.title("カレンダー") 223mycal = mycalendar(root) 224mycal.pack() 225root.mainloop()

checkboxを出力しているところは下記になります。

python

1 if not len(list) == 0: 2 for out in list: 3 self.ddmm = tk.Checkbutton(self.master, text="{} {}".format(out[1],out[2]), variable=bln) 4 self.list_chk.append(bln) 5 self.ddmm.place(x=180, y=i) 6 i = i + 20 7 self.list_time.append(out[1]) 8 self.list_memo.append(out[2]) 9 else: 10 self.notinfo = tk.Label(self.master, text="今日の予定はありません") 11 self.notinfo.pack()

実行などをする場合は下記から
cloneしてください
https://github.com/momiji1231/notification-calendar

ご教授の程、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

チェックボックスの生成とlist_chkへの登録に使われる真偽値オブジェクトblnを、forループの外側(手前)で作成しているため、すべてのチェックボックスで同一のオブジェクトが登録されます。このため、ひとつのチェックボックスでTrueになれば、すべてのチェックボックスがチェックされます。

対策は、もちろん個別の真偽値オブジェクトを登録することです。

Python

1 for out in list: 2 bln = tk.BooleanVar() # this 3 bln.set(False) # and this 4 self.ddmm = tk.Checkbutton(self.master, text="{} {}".format(out[1], out[2]), variable=bln) 5 self.list_chk.append(bln) 6(以下略)

のように、forループの中でblnを生成すれば、毎回異なるオブジェクトがチェックボックスとlist_chkに登録され、それぞれ独立して扱うことができます。

投稿2020/09/12 01:42

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問