前提・実現したいこと
「テトリス風ゲーム作りで学ぶ初めてのPython(標準モジュール)プログラミング」という書籍で分からない部分があるので教えていただきたいことがあります。下記がサンプルになるのですが、
class GameBoardでtk.Canvasクラスを継承しているということは、
GameBoardのインスタンスでもplaceメソッドを利用できるはずだと思うのですが、
親クラスを初期化して引数を渡さないといけない理由が分かりません。
初期化しないとエラーになるのは、判明しています。
なぜ、親クラスを初期化しないといけないのか、教えていただきたいです。
追加
該当のソースコード
Python
1import tkinter as tk 2 3class GameBoard(tk.Canvas): 4 def __init__(self,app): 5 tk.Canvas.__init__(self,app) 6 7 8class TetGame: 9 def __init__(self,app,w,h): 10 self.app = app 11 self.w= w 12 self.h= h 13 gameboard = GameBoard(app) 14 gameboard.place(x=10,y=10) 15 gameboard.config(width=100,height=100,bg="black") 16 self.Center() 17 18 def Center(self): 19 ws =self.app.winfo_screenwidth() 20 hs =self.app.winfo_screenheight() 21 x = int((ws/2) - (self.w/2)) 22 y = int((hs/2) - (self.h/2)) 23 app.geometry(f'{self.w}x{self.h}+{x}+{y}') 24 25app =tk.Tk() 26app.title("TetGame") 27tetgame = TetGame(app,400,300) 28app.mainloop() 29 30``` 31 32 33### 試したこと 34 35親クラスの初期化は引数はなくても問題ないですが、 36初期化しないとエラーになります。 37 38①例えば、引数(app)をとらない場合、これはエラーがでません。 39 40```ここに言語を入力 41class GameBoard(tk.Canvas): 42 def __init__(self,app): 43 tk.Canvas.__init__(self) 44 45``` 46②次に、親クラスの初期化省略はエラーになります。 47 48```ここに言語を入力 49class GameBoard(tk.Canvas): 50 def __init__(self,app): 51 pass 52``` 53③また、両方の初期化を省略すると、上手くいきます。 54```ここに言語を入力 55class GameBoard(tk.Canvas): 56 pass 57``` 58 59 60 61### エラーメッセージ 62 63``` 64**上述の②の場合のエラーメッセージです** 65 66 67Traceback (most recent call last): 68 File "C:\Users\xxx\OneDrive\デスクトップ\個人\0.PG\IDLE\canvas.py", line 27, in <module> 69 tetgame = TetGame(app,400,300) 70 File "C:\Users\xxx\OneDrive\デスクトップ\個人\0.PG\IDLE\canvas.py", line 14, in __init__ 71 gameboard.place(x=10,y=10) 72 File "C:\Users\xxx\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 2186, in place_configure 73 self.tk.call( 74AttributeError: 'GameBoard' object has no attribute 'tk' 75```
回答2件
あなたの回答
tips
プレビュー