

Python初心者です。tkinterとcanvasで
次のように物理の斜方投射のプログラムを書き、
画面右上に座標(x,y)の値が刻々と変わるように表示させたくて、
def update_label():
position_label.config(text=f'Position: ({x}, {y})')
window.after(10, update_label)
や
# 目盛り線を描画 draw_scale_lines()の前に、
update_label()
そして、
update_label()
window.mainloop()
のようにwindow.mainloop()の前にもupdate_label()を呼び出すようにしたのですが、
実行するとコマンドプロンプトが一瞬立ち上がってすぐに落ちてしまいます。
どこをどう直せば良いでしょうか?
ある時刻tの、そのときのボールの座標(x,y)が画面のどこかに表示されるようにしたいです。
インデントはdef move():から
WIDTH, HEIGHT = 800, 600
の前まで入っています。
よろしくお願いします。
import tkinter
import math
def move():
global x, y, vy, t
# ボールの新しい位置を計算
if 0 <= x and x <= WIDTH and 0 <= y and y <= HEIGHT:
x = x0 + v0*math.cos(degrees * math.pi/180) *t
y = y0+ v0*math.sin(degrees * math.pi/180) *t-(g/2)*t**2
t = t + dt
else:
x = x0
y = y0
t = t0
def update_label():
position_label.config(text=f'Position: ({x}, {y})')
window.after(10, update_label)
# ボールの位置を更新
canvas.coords('ball', x-MARGIN, (HEIGHT-y)-MARGIN, x+MARGIN, (HEIGHT-y)+MARGIN)
canvas.coords('ball1', x1-MARGIN, (HEIGHT-y1)-MARGIN, x1+MARGIN, (HEIGHT-y1)+MARGIN)
update_label()
# 目盛り線を描画
draw_scale_lines()
window.after(50, move) # 10ミリ秒ごとにmove関数を呼び出す
def draw_scale_lines():
# 目盛り線を描画
for i in range(1, WIDTH // 10 + 1):
x_pos = i * 10
canvas.create_line(x_pos, 0, x_pos, HEIGHT, fill='#d2d2d2')
for i in range(1, HEIGHT // 10 + 1):
y_pos = i * 10
canvas.create_line(0, y_pos, WIDTH, y_pos, fill='#d2d2d2')
WIDTH, HEIGHT = 800, 600
MARGIN = 10
t0 = 0.0
dt = 0.1
g = 9.8
v0 = float(input('初速度(m/s)を入力してください'))
degrees = float(input('角度(度)を入力してください'))
theta = degrees * math.pi / 180
vx0 = v0 * math.cos(theta)
vy0 = v0 * math.sin(theta)
x0 = 10
y0 = 2 * HEIGHT / 4
x1 = 250
y1 = HEIGHT / 2
x = x0 * WIDTH
y = y0 * HEIGHT
vy = vy0 * HEIGHT
t = t0
geo_str = str(WIDTH+MARGIN*2) + 'x' + str(HEIGHT+MARGIN*2)
window = tkinter.Tk()
window.geometry(geo_str)
window.title('moving')
canvas = tkinter.Canvas(window, width=WIDTH, height=HEIGHT, bg='white')
canvas.place(x=MARGIN, y=MARGIN)
canvas.create_oval(x-MARGIN, (HEIGHT-y)-MARGIN, x+MARGIN, (HEIGHT-y)+MARGIN, fill='red', outline='', tags='ball')
canvas.create_oval(x1-MARGIN, (HEIGHT-y1)-MARGIN, x1+MARGIN, (HEIGHT-y1)+MARGIN, fill='gray', outline='', tags='ball1')
move()
update_label()
window.mainloop()
No.1ベストアンサー
- 回答日時:
ここではスペースやタブのインデントは無視されてしまうので
インデントがわからずきついです。
インデントを全角スペースとかに変換しといてもらえると
こちらで再変換してテストできるんですが・・・
またエラーが起きるとコンソールにいろいろエラーメッセージが
残るはずですが、出てないでしょうか?
ひょっとして Explorer から 直接 pythonソースをダブルクリック
してる?
コマンドプロンプトから起動することをお勧めします。
ソースの気になる点2点。
■
update_labelの中でupdate_labelを呼んでいるような
気がしますが気のせいでしょうか?
stack overflow で落ちると思います。
■
position_label って、中身を入れてるコードが
見当たらないですね。NameError例外で落ちると思います。
No.2
- 回答日時:
あ〜、ひょっとして。
シバン抜けてない?
UNIX流儀なんだけど、ファイルの冒頭に
#! /usr/bin/env python3
とか書く。
以前は違ったんだけど、今だとWindows版PythonでもこれでパスからPythonを探せるようになった。
んで、ひょっとしたらWindowsでは
#! /usr/bin/env python
かもしんない。
DOS窓からPython立ち上げる時、"python"なのか"python3"でどっちかなのか分かる。
(多分Windowsだったら"python"だったように記憶してるけど・・・)
あと、position_labelが未定義だ。

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
if関数とは?
-
プログラム言語
-
今のプログラミング言語
-
著作権法について
-
vba クリップボードクリアにつ...
-
画像生成AIのプロンプトの作り...
-
プログラミングについて
-
pythonの実行に関する質問
-
OS入ってる機器のソフト・アプ...
-
プログラミングに興味があるの...
-
CSVファイルの複数行削除
-
COPYコマンドで、最後に1文字...
-
10進数から2進数に変換 例 185 ...
-
自作scratch アニメの商用利用
-
数学、プログラミング、物理、...
-
従業員が1名だけのSierっている...
-
pip --versionがエラーになる
-
Python 3.12.2 か一番最新のパ...
-
VBAでパワーシェルを実行したい...
-
Google ColaboでGUI作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラム言語
-
vba クリップボードクリアにつ...
-
プログラミングについて
-
画像生成AIのプロンプトの作り...
-
自作scratch アニメの商用利用
-
今のプログラミング言語
-
CSVファイルの複数行削除
-
Python... 環境設定 初心者です...
-
Python 3.12.2 か一番最新のパ...
-
数学、プログラミング、物理、...
-
パイソンのソースコードをChatG...
-
pythonの実行に関する質問
-
pip --versionがエラーになる
-
Geminiフォーム 画像生成で 人...
-
OS入ってる機器のソフト・アプ...
-
Google ColaboでGUI作成
-
google Colabでmatplotlibの描...
-
Webサイト内に埋め込んだmp4動...
-
初心者powershellのPS1ファイル...
-
VBAでパワーシェルを実行したい...
おすすめ情報
一応自己解決しました、有難うございました。
またの機会にはよろしくお願いします。
プログラムのやりとりはideoneでやりとりするのが良いようですね。
https://ideone.com/TiuS8m