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

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

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

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

Python

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

Q&A

解決済

1回答

760閲覧

python gameのstart

IshiKen

総合スコア6

Tkinter

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

Python

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

0グッド

0クリップ

投稿2022/09/05 07:58

編集2022/09/05 08:52

前提

pythonのtkinterモジュールの勉強で簡単なゲームを作っています。
その際に、マウスの左クリックをしたらゲームがスタートする機能を追加しようとコードを書いたのですが、それが反映されません。
また、動いているのですが、エラーが表示されています。

実現したいこと

ゲームをスタートをする機能を追加したいです。
エラーをなくしたい。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "C:\Users\ishii\OneDrive\デスクトップ\python\pythonではじめよう\第13章.py", line 73, in <module> ball.draw() File "C:\Users\ishii\OneDrive\デスクトップ\python\pythonではじめよう\第13章.py", line 24, in draw self.canvas.move(self.id,self.x,self.y) File "C:\Users\ishii\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 2585, in move self.tk.call((self._w, 'move') + args) _tkinter.TclError: invalid command name ".!canvas"

該当のソースコード

python

1from tkinter import* 2import random 3import time 4class Ball: 5 def __init__(self,canvas,paddle,color): 6 self.canvas = canvas 7 self.paddle = paddle 8 self.id = canvas.create_oval(10,10,25,25,fill=color) 9 self.canvas.move(self.id,245,100) 10 starts = [-3,-2,-1,1,2,3] 11 random.shuffle(starts) 12 self.x=starts[0] 13 self.y=-3 14 self.canvas_height=self.canvas.winfo_height() 15 self.canvas_width=self.canvas.winfo_width() 16 self.hit_bottom = False 17 def hit_paddle(self,pos): 18 paddle_pos = self.canvas.coords(self.paddle.id) 19 if pos[2]>=paddle_pos[0] and pos[0]<=paddle_pos[2]: 20 if pos[3]>=paddle_pos[1] and pos[3]<=paddle_pos[3]: 21 return True 22 return False 23 def draw(self): 24 self.canvas.move(self.id,self.x,self.y) 25 pos = self.canvas.coords(self.id) 26 if pos[1]<=0: 27 self.y=3 28 if pos[3]>=self.canvas_height: 29 self.hit_bottom = True 30 if self.hit_paddle(pos) == True: 31 self.y =-3 32 if pos[0]<=0: 33 self.x = 3 34 if pos[2]>= self.canvas_width: 35 self.x =-3 36class Paddle: 37 def __init__(self,canvas,color): 38 self.canvas = canvas 39 self.id = canvas.create_rectangle(0,0,100,10,fill=color) 40 self.canvas.move(self.id,200,300) 41 self.x = 0 42 self.canvas_width = self.canvas.winfo_width() 43 self.started = False 44 self.canvas.bind_all('<KeyPress-Left>',self.turn_left) 45 self.canvas.bind_all('<KeyPress-Right>',self.turn_right) 46 self.canvas.bind_all('<Button-1>',self.start_game) 47 def turn_left(self,evt): 48 self.x =-2 49 def turn_right(self,evl): 50 self.x = 2 51 def start_game(self,evt): 52 self.started = True 53 def draw(self): 54 self.canvas.move(self.id,self.x,0) 55 pos = self.canvas.coords(self.id) 56 if pos[0]<= 0: 57 self.x = 0 58 elif pos[2]>=self.canvas_width: 59 self.x =0 60tk=Tk() 61tk.title("Game") 62tk.resizable(0,0) 63tk.wm_attributes("-topmost",1) 64canvas = Canvas(tk,width=500,height=400,bd=0,highlightthickness=0) 65canvas.pack() 66tk.update() 67paddle = Paddle(canvas,'blue') 68ball = Ball(canvas,paddle,'red') 69while True: 70 if ball.hit_bottom == False and paddle.started == True: 71 ball.draw() 72 paddle.draw() 73 ball.draw() 74 paddle.draw() 75 tk.update_idletasks() 76 tk.update() 77 time.sleep(0.01) 78

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

TakaiY

2022/09/05 08:44

エラーメッセージはそこだけでなく、全て載せていただけますか。 また、質問はエラーメッセージのこと以外にもあるようですが、「gameをスタートする機能を作りたかったのですがコードを書いてもゲームの仕様が変わりません。」では何が知りたいのかわかりません。
guest

回答1

0

ベストアンサー

tkinter は tk.mainloop() を呼び出さないとイベント処理や描画処理をしませんよ。
time.sleep() は使ってはいけません。時間制御は ウィジェット.after() を使って行います。
マウスイベントやタイマーイベントなどに応じて動作するイベントドリブンな作りにしましょう。

python

1from tkinter import* 2import random 3 4 5class Ball: 6 def __init__(self, canvas, paddle, color): 7 self.canvas = canvas 8 self.paddle = paddle 9 self.id = canvas.create_oval(10, 10, 25, 25, fill=color) 10 self.canvas.move(self.id, 245, 100) 11 starts = [-3, -2, -1, 1, 2, 3] 12 random.shuffle(starts) 13 self.x = starts[0] 14 self.y = -3 15 self.canvas_height = self.canvas.winfo_height() 16 self.canvas_width = self.canvas.winfo_width() 17 self.hit_bottom = False 18 19 def hit_paddle(self, pos): 20 paddle_pos = self.canvas.coords(self.paddle.id) 21 if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]: 22 if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]: 23 return True 24 return False 25 26 def move(self): 27 self.canvas.move(self.id, self.x, self.y) 28 pos = self.canvas.coords(self.id) 29 if pos[1] <= 0: 30 self.y = 3 31 if pos[3] >= self.canvas_height: 32 self.hit_bottom = True 33 if self.hit_paddle(pos) == True: 34 self.y = -3 35 if pos[0] <= 0: 36 self.x = 3 37 if pos[2] >= self.canvas_width: 38 self.x = -3 39 40 41class Paddle: 42 def __init__(self, canvas, color): 43 self.canvas = canvas 44 self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color) 45 self.canvas.move(self.id, 200, 300) 46 self.x = 0 47 self.canvas_width = self.canvas.winfo_width() 48 self.started = False 49 self.canvas.bind_all('<KeyPress-Left>', self.turn_left) 50 self.canvas.bind_all('<KeyPress-Right>', self.turn_right) 51 self.canvas.bind_all('<Button-1>', self.start_game) 52 53 def turn_left(self, evt): 54 self.x = -2 55 56 def turn_right(self, evl): 57 self.x = 2 58 59 def start_game(self, evt): 60 self.started = True 61 62 def move(self): 63 self.canvas.move(self.id, self.x, 0) 64 pos = self.canvas.coords(self.id) 65 if pos[0] <= 0: 66 self.x = 0 67 elif pos[2] >= self.canvas_width: 68 self.x = 0 69 70 71def repeat(): 72 if paddle.started and not ball.hit_bottom: 73 ball.move() 74 paddle.move() 75 tk.after(20, repeat) 76 77 78tk = Tk() 79tk.title("Game") 80tk.resizable(0, 0) 81tk.wm_attributes("-topmost", 1) 82canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0) 83canvas.pack() 84tk.update() 85paddle = Paddle(canvas, 'blue') 86ball = Ball(canvas, paddle, 'red') 87 88tk.after(20, repeat) 89tk.mainloop()

投稿2022/09/05 16:04

編集2022/09/05 16:28
shiracamus

総合スコア5406

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

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

IshiKen

2022/09/06 03:15

ありがとうございます。解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問