機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【python】【tkinter】【part2】canvasを使って図形を動かす

tkintercanvasを使って図形をウインド上で動かす

2020/01/26追記:プログラミング初心者に向けたpythonの勉強法と手順を記事にしました。

stjun.hatenablog.com

 

■はじめに

前回、tkintercanvasで図形を描く方法を紹介しました。

stjun.hatenablog.com

今回は、前回描いた図形をGIF画像みたいに動かしてみたいと思います。

 

■コード

 

import tkinter as tk
import time

#ウインドを作成
root=tk.Tk()
root.geometry('400x400')
root.title('canvasの使い方')

#図形を壁画するキャンバスをウインド上に作成
canvas=tk.Canvas(root,width=300,height=300,bg="white")
canvas.pack()

#図形の壁画
dx=20
dy=20
square=canvas.create_rectangle(5,5,5+dx,5+dy,fill='red')#四角

#動かすためのパラメータ
x=150#四角の初期x座標
y=150#四角の初期y座標
Vy=2#どのくらいの速度で動かすか
Y_current=300-dy#どこまで動かすか(基本はcanvasの端から端)

start=time.time() #開始時間
stop_time=10 #目標終了時間

#無限ループ
while True:
    canvas.coords(square,x,y,x+dx,y+dy) #squareを指定の座標に移動させる
    y+=Vy #縦方向に少しづつ動かす
    if y<=0: #上端に到達したら
        Vy=abs(Vy) #下向きに動かす
    elif y>=Y_current: #下端に到達したら
        Vy=-abs(Vy) #上向きに動かす
    time.sleep(0.02) #0.02秒ずつ更新
    root.update() #ウインド画面を更新
    
    #目標終了時間に達したらループから抜ける
    if time.time()-start>stop_time:
        print('処理時間は',time.time()-start,'秒です')
        break

root.mainloop()

実行すると以下のように四角が動きます。

(今回は動画の載せ方が分からないので画像です)

f:id:stjun:20191028214057p:plain

f:id:stjun:20191028214130p:plain

f:id:stjun:20191028214203p:plain

また処理にかかった時間を表示させみました。

f:id:stjun:20191028214300p:plain

目標時間が10秒なので 結構ずれていますね。

 

■自分が使ってるお得情報の紹介

私はAmazon kindle unlimitedというサービスを1年以上利用しています。

これは月額980円で 和書12万冊以上の電子書籍を読めるサービスです。

ビジネス本、雑誌、漫画、技術本など様々な本を読むことができます。10冊まで端末にダウンロードできるのでネット環境がなくても(オフラインでも)見れます。

なおkindle unlimitedは最初の30日間無料のため、気軽に登録してみて、あまり読みたい本が無ければすぐに解約しても問題ありません。

それか30日内に気になる本を全て読破すれば実質タダです。

ぜひ気になった方はチェックしてみて下さい。

なおkindleにない本等を買う時はamazonギフト券(amazonで使えるポイント)を買い、ポイントで数冊まとめて買った方がお得です。

ギフト券(ポイント)は買ったら10年も有効で、ポイントが付きます。さらに本をまとめ買い(2冊以上同時に)買うと、ポイントがもらえます。

https://www.amazon.co.jp/b?ie=UTF8&node=5431437051

学生さんであればkindle unlimitedよりも年2450円(月210円程度)で映画見放題、音楽聞き放題、本読み放題の「prime student」がおすすめです。

以下に私がkindle unlimitedで読んだ本を載せておきます。

さおだけ屋はなぜ潰れないのか? 身近な疑問からはじめる会計学 (光文社新書)

さおだけ屋はなぜ潰れないのか? 身近な疑問からはじめる会計学 (光文社新書)

  • 作者:山田 真哉
  • 出版社/メーカー: 光文社
  • 発売日: 2005/02/16
  • メディア: 新書
 
多動力 (NewsPicks Book) (幻冬舎文庫)

多動力 (NewsPicks Book) (幻冬舎文庫)

 

 

■雑誌系

 

MONOQLO (モノクロ) 2020年 02月号 [雑誌]

MONOQLO (モノクロ) 2020年 02月号 [雑誌]

 
家電批評 2020年 1月号 [雑誌]

家電批評 2020年 1月号 [雑誌]

  • 作者: 
  • 出版社/メーカー: 晋遊舎
  • 発売日: 2019/12/03
  • メディア: Kindle
 
ロードバイク完全メンテナンス (エイムック 3544 BiCYCLE CLUB別冊)

ロードバイク完全メンテナンス (エイムック 3544 BiCYCLE CLUB別冊)

  • 作者: 
  • 出版社/メーカー: エイ出版社
  • 発売日: 2016/11/29
  • メディア: ムック
 
繰り返し作りたくなる!  ラク弁当レシピ (エイムック 3680)

繰り返し作りたくなる! ラク弁当レシピ (エイムック 3680)

 
Tarzan(ターザン) 2020年1月23日号 No.779 [内臓脂肪 皮下脂肪すっきり落とす!] [雑誌]

Tarzan(ターザン) 2020年1月23日号 No.779 [内臓脂肪 皮下脂肪すっきり落とす!] [雑誌]

  • 作者: 
  • 出版社/メーカー: マガジンハウス
  • 発売日: 2020/01/04
  • メディア: Kindle
 
DIME(ダイム) 2020年 03 月号 [雑誌]

DIME(ダイム) 2020年 03 月号 [雑誌]

  • 作者: 
  • 出版社/メーカー: 小学館
  • 発売日: 2019/12/16
  • メディア: 雑誌
 

 

■説明

キャンバスおよび図形の作成は前回の記事で紹介したので省略します。

図形を動かすには次のようにcoords()を使います。

canvas.coords(square,x,y,x+dx,y+dy) #squareを指定の座標に移動させる

これによりオブジェクトであるsquareがカッコ内の座標「左端の角の座標(x,y)、右下の角の座標(x+dx,y+dy)」に移動します。

ここで縦方向に動かしたいなら、

y+=Vy #縦方向に少しづつ動かす

のようにy座標を少しづつ動かしていけば良いことになります。

横方向に動かしたいならx+=Vyになります。

また画面外に行かないように、次のように端に到達したら動く向きを反対にしています。

if y<=0: #上端に到達したら
        Vy=abs(Vy) #下向きに動かす
    elif y>=Y_current: #下端に到達したら
        Vy=-abs(Vy) #上向きに動かす

また人間の目で追えるように0.02秒ごとに処理が行われるようにしています。

time.sleep(0.02) #0.02秒ずつ更新

最後に目標時間に到達したらループを抜けるようにしています。

この判定は好きに変えることができます、例えば下端に四角が接したら終了させたい場合は、if y>=Y_currentと描けばよいです

#目標終了時間に達したらループから抜ける
    if time.time()-start>stop_time:
        print('処理時間は',time.time()-start,'秒です')
        break

 

 

■おわりに

いかがだったでしょうか。次回はこの機能を使って簡単な物理シミュレーションをしてみたいと思います。

次記事

stjun.hatenablog.com