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

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

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

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

Q&A

解決済

2回答

1327閲覧

エラーの表示が出ていないのに、プログラムが動かない。

TakeshiSaito

総合スコア7

Python

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

0グッド

0クリップ

投稿2021/12/01 01:49

編集2021/12/03 01:52

お世話になっております。
以下のプログラムですが、猫は通った部分がピンクに塗られていくのですが、プログラムにはエラーメッセージが出ておらず動きません。
どこを修正して良いのかわからないので教えて頂ければ幸いです。よろしくお願いいたします。

import tkinter

key=""
def key_down(e):
global key
key=e.keysym
def key_up(e):
global key
key=""

mx=1
my=1
def main_proc():
global mx,my,key
if key == "Up" and maze[my-1][mx] == 0:
my = my - 1
if key == "Down" and maze[my+1][mx] == 0:
my = my + 1
if key == "Left" and maze[my][mx-1] == 0:
mx = mx - 1
if key == "Right" and maze[my][mx+1] == 0:
mx = mx + 1
if maze[my][mx] == 0:
maze[my][mx] = 2
canvas.create_rectangle(mx80,my80,mx80+79,my80+79,fill="pink",
width=0)
canvas.delete("MYCHR")
canvas.create_image(mx80+40,my80+40,image=img,tag="MYCHR")
root.after(300,main_proc)

root=tkinter.Tk()
root.title("迷路を塗るニャン")
root.bind("<KeyPress>",key_down)
root.bind("<KeyRelease>",key_up)
canvas=tkinter.Canvas(width=800,height=560,bg="white")
canvas.pack()

maze=[
[1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,1,0,0,1],
[1,0,1,1,0,0,1,0,0,1],
[1,0,0,1,0,0,0,0,0,1],
[1,0,0,1,1,1,1,1,0,1],
[1,0,0,0,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1]
]
for y in range(7):
for x in range(10):
if maze[y][x]== 1:
canvas.create_rectangle(x80,y80,x80+79,y80+79,
fill="skyblue",width=0)

img=tkinter.PhotoImage(file="mimi_s.png")
canvas.create_image(mx80+40,my80+40,image=img,tag="MYCHR")
main_proc()
root.mainloop()

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

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

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

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

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

ijufumi

2021/12/01 02:34

コードのインデントを入れて頂いても良いでしょうか? Pythonはインデントでfunctionやループの範囲が決まるので、インデントを正しく記述しないと読むことすらできないです。 あと、コードは「コードの挿入」機能を使って記述することをオススメします。その方がシンタックスハイライトが効いて、より見やすいです。
TakeshiSaito

2021/12/03 01:16

ご回答ありがとうございます。 コピペの時にインデントがずれてしまっている部分ができてしまったようです。 修正します。 ありがとうございました。
TakeshiSaito

2021/12/03 01:56

申し訳ございません。 元の文はインデントをちゃんと入れているのですが、プレビューになるとインデントが消えてしまいます。
guest

回答2

0

ベストアンサー

main_proc() 内のインデントの深さを間違えているのではないでしょうか。おそらく、正しくは以下の様になるかと思います(ロジックが正しいのかはどうかまでは判りません)。

python

1def main_proc(): 2 global mx,my,key 3 if key == "Up" and maze[my-1][mx] == 0: 4 my = my - 1 5 if key == "Down" and maze[my+1][mx] == 0: 6 my = my + 1 7 if key == "Left" and maze[my][mx-1] == 0: 8 mx = mx - 1 9 if key == "Right" and maze[my][mx+1] == 0: 10 mx = mx + 1 11 if maze[my][mx] == 0: 12 maze[my][mx] = 2 13 14 canvas.create_rectangle(mx*80,my*80,mx*80+79,my*80+79,fill="pink", 15width=0) 16 canvas.delete("MYCHR") 17 canvas.create_image(mx*80+40,my*80+40,image=img,tag="MYCHR") 18 root.after(300,main_proc)

投稿2021/12/03 02:06

melian

総合スコア19798

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

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

TakeshiSaito

2021/12/03 11:12

ご指摘の通りに修正したところ、無事プログラムが動きました。 前回に続き、今回もありがとうございました。 助かりました。とても感謝しております。
guest

0

tkinterで画面上の描画を更新するための方法について誤解があるようです。

tkinterでは、root.mainloop() が動作している間、キー入力などのイベントを検知すると、そのイベンにあらかじめバインドされた処理が動作します。

今の作りでは、キー押し/放しそれぞれのイベントにバインドされた処理が動きますが、その処理では変数keyの変更のみ行なっています。

描画の変更を行なうであろうmain_proc()関数は、main_loop()の前で1回だけ呼ばれていますが、それだけで、イベントが発生して変数が変更された後に呼ばれるようにはなっていません。

基本的なところが間違えていますので、どう直したらというアドバイスが難しいです。
tkinterを使って、キー入力で描画をするような処理の例は検索するといろいろ出てきますので、それを参考に処理を見直してみるのがいいと思います。

投稿2021/12/01 06:36

TakaiY

総合スコア12765

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

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

TakeshiSaito

2021/12/03 01:17

ありがとうございました。 修正してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問