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

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

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

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

Python

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

Q&A

解決済

2回答

1279閲覧

class1の中でinstance化したclass2の中でclass1のselfを使いたい場合

momey0709

総合スコア5

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/09/11 01:41

mycalendarのclassでinstance化して使用している
Win2のclassの中で
mycalendarのself定義しているdayを使用したいのですが、
どう書けばいいのかわかりません。
どなたかご教授願います。

python

1# -*- coding:utf-8 -*- 2 3import tkinter as tk 4import datetime 5 6 7# カレンダーを作成するフレームクラス 8class mycalendar(tk.Frame): 9 def __init__(self, master=None, cnf={}, **kw): 10 "初期化メソッド" 11 tk.Frame.__init__(self, master, cnf, **kw) 12 13 # 現在の日付を取得 14 now = datetime.datetime.now() 15 # 現在の年と月を属性に追加 16 self.year = now.year 17 self.month = now.month 18 19 # frame_top部分の作成 20 frame_top = tk.Frame(self) 21 frame_top.pack(pady=5) 22 self.previous_month = tk.Label(frame_top, text="<", font=("", 14)) 23 self.previous_month.bind("<1>", self.change_month) 24 self.previous_month.pack(side="left", padx=10) 25 self.current_year = tk.Label(frame_top, text=self.year, font=("", 18)) 26 self.current_year.pack(side="left") 27 self.current_month = tk.Label(frame_top, text=self.month, font=("", 18)) 28 self.current_month.pack(side="left") 29 self.next_month = tk.Label(frame_top, text=">", font=("", 14)) 30 self.next_month.bind("<1>", self.change_month) 31 self.next_month.pack(side="left", padx=10) 32 33 # frame_week部分の作成 34 frame_week = tk.Frame(self) 35 frame_week.pack() 36 button_mon = d_button(frame_week, text="Mon") 37 button_mon.grid(column=0, row=0) 38 button_tue = d_button(frame_week, text="Tue") 39 button_tue.grid(column=1, row=0) 40 button_wed = d_button(frame_week, text="Wed") 41 button_wed.grid(column=2, row=0) 42 button_thu = d_button(frame_week, text="Thu") 43 button_thu.grid(column=3, row=0) 44 button_fri = d_button(frame_week, text="Fri") 45 button_fri.grid(column=4, row=0) 46 button_sta = d_button(frame_week, text="Sat", fg="blue") 47 button_sta.grid(column=5, row=0) 48 button_san = d_button(frame_week, text="San", fg="red") 49 button_san.grid(column=6, row=0) 50 51 # frame_calendar部分の作成 52 self.frame_calendar = tk.Frame(self) 53 self.frame_calendar.pack() 54 55 # 日付部分を作成するメソッドの呼び出し 56 self.create_calendar(self.year, self.month) 57 58 def create_calendar(self, year, month): 59 "指定した年(year),月(month)のカレンダーウィジェットを作成する" 60 61 # ボタンがある場合には削除する(初期化) 62 try: 63 for key, item in self.day.items(): 64 item.destroy() 65 except: 66 pass 67 68 # calendarモジュールのインスタンスを作成 69 import calendar 70 cal = calendar.Calendar() 71 # 指定した年月のカレンダーをリストで返す 72 days = cal.monthdayscalendar(year, month) 73 74 # 日付ボタンを格納する変数をdict型で作成 75 self.day = {} 76 # for文を用いて、日付ボタンを生成 77 for i in range(0, 42): 78 c = i - (7 * int(i / 7)) 79 r = int(i / 7) 80 try: 81 # 日付が0でなかったら、ボタン作成 82 if days[r][c] != 0: 83 #日付ボタンを押下すると別ウィンドウを表示 84 self.day[i] = d_button(self.frame_calendar, text=days[r][c], command=self.createNewWindow) 85 self.day[i].grid(column=c, row=r) 86 except: 87 """ 88 月によっては、i=41まで日付がないため、日付がないiのエラー回避が必要 89 """ 90 break 91 92 def change_month(self, event): 93 # 押されたラベルを判定し、月の計算 94 if event.widget["text"] == "<": 95 self.month -= 1 96 else: 97 self.month += 1 98 # 月が0、13になったときの処理 99 if self.month == 0: 100 self.year -= 1 101 self.month = 12 102 elif self.month == 13: 103 self.year += 1 104 self.month = 1 105 # frame_topにある年と月のラベルを変更する 106 self.current_year["text"] = self.year 107 self.current_month["text"] = self.month 108 # 日付部分を作成するメソッドの呼び出し 109 self.create_calendar(self.year, self.month) 110 111 #別ウィンドウを呼び出し関数 112 def createNewWindow(self): 113 self.newWindow = tk.Toplevel(root) 114 self.app = Win2(self.newWindow) 115 116 117# デフォルトのボタンクラス 118class d_button(tk.Button): 119 def __init__(self, master=None, cnf={}, **kw): 120 tk.Button.__init__(self, master, cnf, **kw) 121 self.configure(font=("", 14), height=2, width=4, relief="flat") 122 123# 別ウィンドウクラス 124class Win2(tk.Frame): 125 def __init__(self,master): 126 127 super().__init__(master) 128 self.pack() 129 self.master.geometry("500x500") 130 self.master.title("add schedule") 131 self.today_schedule() 132 #self.create_text() 133 self.create_addbtn() 134 self.create_clsbtn() 135 136 def today_schedule(self): 137 now = datetime.datetime.now() 138 # 現在の年と月を属性に追加 139 self.year = now.year 140 self.month = now.month if len(str(now.month)) == 2 else "0{}".format(now.month) 141 self.day = now.day if len(str(now.day)) == 2 else "0{}".format(now.month) 142 print("year={},month={},day={}".format(self.year, self.month, self.day)) 143 yymmdd = "{}-{}-{}".format(self.year, self.month, self.day) 144 print("yymmdd = {}".format(yymmdd)) 145 import sqlite3 146 dbfile = sqlite3.connect('schedule.db') 147 c = dbfile.cursor() 148 c.execute("select * from cl_table") 149 list = c.fetchone() 150 self.ddmm = tk.Label(self.master, text=list[1]) 151 self.schedule = tk.Label(self.master, text=list[2]) 152 self.ddmm.place(x=150, y=50) 153 self.schedule.place(x=250, y=50) 154 155 156 157 158 159 # 別ウィンドウボタン表示 160 def create_addbtn(self): 161 # Button 162 self.button_quit = tk.Button(self.master,text="Add", command=self.quit_window) 163 self.button_quit.place(x=420, y=450) 164 165 # 別ウィンドウボタン表示 166 def create_clsbtn(self): 167 # Button 168 self.button_quit = tk.Button(self.master,text="Close", command=self.quit_window) 169 self.button_quit.place(x=350, y=450) 170 171 # 別ウィンドウclose関数 172 def quit_window(self): 173 self.master.destroy() 174 175 def create_text(self): 176 self.schedule_input = tk.Entry(self.master) 177 self.schedule_input.pack() 178 179# ルートフレームの定義 180root = tk.Tk() 181root.title("Calendar App") 182mycal = mycalendar(root) 183mycal.pack() 184root.mainloop()

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

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

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

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

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

guest

回答2

0

ベストアンサー

Win2クラスにmycalendarクラスで作ったToplevelのself.newWindowを渡していますが、
理屈はそれと全く同じです。

python

1# カレンダーを作成するフレームクラス 2class mycalendar(tk.Frame): 3・・・ 4 #別ウィンドウを呼び出し関数 5 def createNewWindow(self): 6 self.newWindow = tk.Toplevel(root) 7 self.app = Win2(self.newWindow,self.day) 8・・・ 9# 別ウィンドウクラス 10class Win2(tk.Frame): 11 def __init__(self,master,day): 12 print(day) 13・・・

追記
そちらの質問になると押されたボタンがどれであるか判別するって話になりますね。
Buttonヴィジェットのcommandで指定した関数には通常だと何の引数も送られないので色々と面倒です。
とりあえず今回はcommandではなくbindを使って引数を送る方法を記述しておきます。

python

1・・・ 2# カレンダーを作成するフレームクラス 3class mycalendar(tk.Frame): 4・・・ 5 def create_calendar(self, year, month): 6 "指定した年(year),月(month)のカレンダーウィジェットを作成する" 7・・・ 8 # 日付ボタンを格納する変数をdict型で作成 9 self.day = {} 10 # for文を用いて、日付ボタンを生成 11 for i in range(0, 42): 12 c = i - (7 * int(i / 7)) 13 r = int(i / 7) 14 try: 15 # 日付が0でなかったら、ボタン作成 16 if days[r][c] != 0: 17 #日付ボタンを押下すると別ウィンドウを表示 18 self.day[i] = d_button(self.frame_calendar, text=days[r][c]) 19 self.day[i].grid(column=c, row=r) 20 self.day[i].bind("<ButtonPress>", self.createNewWindow) 21 except: 22 """ 23 月によっては、i=41まで日付がないため、日付がないiのエラー回避が必要 24 """ 25 break 26・・・ 27 #別ウィンドウを呼び出し関数 28 def createNewWindow(self,event): 29 self.newWindow = tk.Toplevel(root) 30 self.app = Win2(self.newWindow,event) 31・・・ 32# 別ウィンドウクラス 33class Win2(tk.Frame): 34 def __init__(self,master,event): 35 print(event.widget["text"]) 36・・・

投稿2020/09/11 02:18

編集2020/09/11 08:03
yureighost

総合スコア2183

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

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

momey0709

2020/09/11 07:03

回答ありがとうございます。 できたことにはできたんですが、 月末の日付のみがself.dayとして渡されてしまいます。 やりたいこととしては押されたボタンの日付を取得したいのですが、 その場合、どうすれば良いでしょうか ご回答の程お願い致します。
momey0709

2020/09/11 08:20

再度回答ありがとうございます。 ですが、 こんなerrorになってしまいました Traceback (most recent call last): File "/Users/kusano/.pyenv/versions/3.8.0/lib/python3.8/tkinter/__init__.py", line 1883, in __call__ return self.func(*args) TypeError: createNewWindow() takes 1 positional argument but 2 were given
momey0709

2020/09/11 08:50

すみません、 errorはこちらの勘違いでした
guest

0

そのクラスにインスタンスを渡してやれば、そのインスタンスからアクセスできます

投稿2020/09/11 01:43

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問