

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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
- その他(プログラミング・Web制作) Pythonでのかんたんな物理シミュレーションについての書籍 5 2023/06/02 07:37
- その他(プログラミング・Web制作) ボールの動きがスムーズに動いてかつ目盛り線描画を維持するためには 4 2023/05/31 10:01
- その他(プログラミング・Web制作) 物理の斜方投射で目盛りに数値を入れたい 2 2023/05/27 06:32
- その他(プログラミング・Web制作) 物理の斜方投射の目盛り線とx軸、y軸の追加について 3 2023/05/26 21:11
- その他(プログラミング・Web制作) 物理の斜方投射のシミュレーションにおける位置や速度の単位について 4 2023/05/31 09:50
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
- HTML・CSS html/cssで要素が出てこなくて困ってます 1 2022/12/31 16:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
VB.NET オーナードロー
-
word
-
【VC++】コントロールの上に描画
-
クライアント領域のコントロー...
-
GetGlyphOutline() ご利用経験...
-
ウインドウサイズを変更しても...
-
C# ラバーバンドの描画を快適に...
-
Excel 2019 [オプション]の[リボンのユ...
-
MFCでOnPaintのタイミング
-
3Dシミュレータの開発言語
-
c++ ダブルバッファリング、以...
-
グラフの交点の求め方(Excel)
-
コントロールの書式設定で、“コ...
-
「アイテムは収集されました」...
-
勝手にウィンドウが開いて止ま...
-
液晶14.1型SXGAの利便性
-
エクセルで作った新しいウイン...
-
DLLから表示しているモーダルダ...
-
スピンボタンを右クリックして...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
panelのスクロール表示について
-
VC++プログラムをつかったBMP画...
-
VBAにGDI+を参照させる方法
-
google Colabでmatplotlibの描...
-
MFCでOnPaintのタイミング
-
MFCのタイマーのつかい方を教え...
-
UpdateData( FALSE); による文...
-
CStaticコントロールの静的イメ...
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
win32api 画面のちらつき
-
c++ ダブルバッファリング、以...
-
CDC(LineTo)で描画した線を透過...
-
BitBltでの表示での問題です。
おすすめ情報
一応自己解決しました、有難うございました。
またの機会にはよろしくお願いします。
プログラムのやりとりはideoneでやりとりするのが良いようですね。
https://ideone.com/TiuS8m