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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

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

Windows 11

Windows 11は、Windows 10の後継バージョン。それまでのMetroデザインを廃止し、Fluentデザインを導入しています。スタートメニューの構成やウィンドウのデザインの変更の他、Androidアプリをネイティブに実行できます。

Q&A

解決済

2回答

1685閲覧

1秒ごとに交互に処理を切り替えたい

C2105

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

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

Windows 11

Windows 11は、Windows 10の後継バージョン。それまでのMetroデザインを廃止し、Fluentデザインを導入しています。スタートメニューの構成やウィンドウのデザインの変更の他、Androidアプリをネイティブに実行できます。

0グッド

2クリップ

投稿2023/02/18 10:15

編集2023/02/18 14:06

実現したいこと

  • 1秒ごとに交互に処理を切り替えたい

前提

最近、VisualStudioCodeを用いPythonを勉強をしています。

ですが自分では実現不可能なことにぶつかり、
検索してもこのような事例は見つからず困り果てこのサイトを利用させていただきました。

それが「1秒ごとに交互に処理を切り替えたい」です。

例えば処理Aと処理Bが存在するとき、この処理を
A → 一秒待つ → B → 一秒待つ → A → 一秒待つ → B → 一秒待つ ……
というようなことをしたいのです。

ですが、自分の浅い知識で色々とやってみたのですがうまくいきません。

やってみたことは下記に記しておきます。

※処理A・Bをprintとしていますがこれは仮です。
※本来はフォームを表示したうえでフォーム上のキャンバスの上の画像の位置を切り替えたいです。
(ややこしかったらすみません)
※ただコードがどういう動きをしているか確かめている間は実際したかった処理A・Bをコメントアウトした後、
処理A・Bにprintを追記して動かしています

該当のソースコード※この中にやってみたことが書いてあります

Python

1#パターン1 2#予測:afterで処理を遅らせて1秒ずつ出力させる!完璧やなこいつは! 3def Roop: 4 if value % 2 == 0: 5 print('0') #処理A 6 value += 1 7 else: 8 print('1') #処理B 9 value += 1 10 root.after(1000, self.Roop) 11#結果:高速で0と1が出力される。 12 13#パターン2 14#予測:関数の外にafterを置けばいいのかな?これでたぶんおそらく大丈夫! 15def Roop: 16 if value % 2 == 0: 17 print('0') #処理A 18 value += 1 19 else: 20 print('1') #処理B 21 value += 1 22root.after(1000, Roop) 23#結果:高速で0と1が出力された後TypeError。メソッドRoopを見失ったとのこと 24 25#パターン3 26#予測:じゃあtimeで処理を止めてみよう!これでいけるやろ! 27def Roop 28 if value % 2 == 0: 29 print('0') #処理A 30 time.sleep(1) 31 value += 1 32 else: 33 print('1') #処理B 34 time.sleep(1) 35 value += 1 36 root.after(1000, self.Roop) 37#結果:0と1を1秒ごとに出力させることに成功。しかし用意していたフォームは出てこなくなる

最後に

私はプログラミング(C#)というものに昨年4月に初めて触れ、
Pythonに触れたのは今月の初め頃なのです。

知らないこと、わからないことがまだまだ多く、
知識も技術も実力不足としか形容のしようがありません。

皆皆様に比べればまだまだ若輩者ではありますが、
どうかお力添えをお願い申し上げます。

コメントを受けての補足

TakaiY さん
コメントありがとうございます。
確かにどこで呼び出しているかわかりづらかったですよね。
思慮が足りず申し訳ないです。
実際に呼び出しているのは下記のような形です。

Python

1class OtamesiRoop: 2  def __init__(self): 3    self.Roop() 4 5  def Roop(): 6    global value 7    if value % 2 == 0: 8      print('0') #処理A 9      value += 1 10    else: 11      print('1') #処理B 12      value += 1 13    root.after(1000, Roop)

のような形です。
使用したクラス自体はroot.mainloop()の1行上で
otamesi = OtamesiRoop()
とインスタンス化してます。
何分このような場所で質問することは初めてなので、
足りない点至らない点あるとは思いますが
何卒よろしくお願いいたします。

コメントを受けての使用したソースコード全体

Python

1import tkinter as tk 2import random 3import time 4 5value = 0 6 7#ウィンドウの横幅 8Window_Width = 600 9#ウィンドウの縦幅 10Window_Height = 600 11 12Cannon_Y = 550 13 14Enemy_Space_X = 100 15Enemy_Space_Y = 60 16Enemy_Move_Space_X = 20 17Enemy_Move_Speed = 2000 18Number_Of_Enemy = 18 19Enemy_Shoot_Interval = 200 20 21Collision_Detection = 300 22 23Bullet_Height = 10 24Bullet_Width = 2 25Bullet_Speed = 10 26 27Text_Good_Size = 10 28Text_Congratulations_Size = 50 29Text_GameClear_Size = 60 30Text_GameOver_Size = 90 31 32#砲台を設定するクラスの定義 33class Cannon: 34 #__init__=クラスのインスタンスの生成時自動呼出しされるメソッド 35 def __init__(self, x, y=Cannon_Y): #self=インスタンスを指し示す 36 # 37 self.x = x 38 self.y = y 39 #self.=Class Cannonの中のメソッドを使う 40 self.draw() 41 self.bind() 42 43 #画像の設置 44 def draw(self): 45 #tag=設置したイラストに名前を付ける 46 self.id = cv.create_image(self.x,self.y,image=cannon_Image,tag="cannon") 47 48 #画像にイベントを作成 49 def bind(self): 50 #ButtonPress-3=右クリック 51 cv.tag_bind(self.id, "<ButtonPress-3>", self.pressed) 52 #Button1-Motion=ウィジェット内でカーソルが動いたとき 53 cv.tag_bind(self.id, "<Motion>", self.dragged) 54 55 #キャンバス上で右クリックを押したときのイベントメソッド 56 def pressed(self, event): 57 #クラスMyBulletのインスタンスを作成 58 mybullet = MyBullet(event.x, self.y) 59 #クラスMyBulletのdrawメソッド 60 mybullet.draw() 61 #クラスMyBulletのshootメソッド 62 mybullet.shoot() 63 64 #キャンバス上でカーソルが動いた時のイベントメソッド 65 def dragged(self, event): 66 #event=イベントの 67 dx = event.x - self.x 68 #coords=指定した画像の座標の変更や情報の取得 69 self.x, self.y = cv.coords(self.id) 70 #coords(画像の指定, x座標, y座標) 71 cv.coords(self.id, self.x+dx, self.y) 72 self.x = event.x 73 74 def destroy(self): 75 #delete=指定した画像の消去 76 cv.delete(self.id) 77 78#発射する弾のクラス 79class MyBullet: 80 #最初に読み込まれるメソッドは__init__とするルールがある 81 def __init__(self, x, y): 82 self.x = x 83 self.y = y 84 85 #画像の設置 86 def draw(self): 87 #rectangle=長方形の設置(左上の座標,右下の座標,色の指定) 88 self.id = cv.create_rectangle(self.x-Bullet_Width, self.y+Bullet_Height, self.x+Bullet_Width, self.y-Bullet_Height, fill="blue") 89 90 def shoot(self): 91 if self.y >= 0: 92 #move=画像の移動(画像の指定,移動するx座標,移動するy座標) 93 cv.move(self.id, 0, -Bullet_Height) 94 self.y -= Bullet_Height 95 #同じクラスのメソッドdefeatを使用 96 self.defeat() 97 #after=処理を遅らせる(遅らせる秒数,経過後に実行するメソッド) 98 root.after(Bullet_Speed, self.shoot) 99 100 def defeat(self): 101 for enemy in enemies: 102 if ((self.x-enemy.x)**2+(self.y-enemy.y)**2) < Collision_Detection: 103 #existをFalseに 104 enemy.exist = False 105 #クラスenemyのメソッドdestroy 106 enemy.destroy() 107 #create_text=テキストの作成 108 cv.create_text(enemy.x, enemy.y, text="good!", fill="cyan", font=("System", Text_Good_Size), tag="good") 109 110 def destroy(self): 111 #画像の消去 112 cv.delete(self.id) 113 114 115#敵のクラス 116class Enemy: 117 #クラスのインスタンス生成時に起動 118 def __init__(self, x, y): 119 self.x = x % Window_Width 120 self.y = y+x//Window_Width*Enemy_Space_X 121 #existをtrueに 122 self.exist = True 123 #同じクラスのメソッドdraw 124 self.draw() 125 #同じクラスのメソッドmove 126 self.move() 127 128 def draw(self): 129 #画像の設置 130 self.id = cv.create_image(self.x, self.y, image=crab_Image, tag="enemy") 131 132 def enemy_shoot(self): 133 if self.exist: 134 #クラスEnemyBulletのインスタンス生成 135 enemybullet = EnemyBullet(self.x, self.y) 136 #クラスEnemyBulletのメソッドdraw 137 enemybullet.draw() 138 #クラスEnemyBulletのメソッドshoot 139 enemybullet.shoot() 140 141 def move(self): 142 global value 143 144 if self.exist: 145 if value % 2 == 0: 146 #self.x += Enemy_Move_Space_X 147 print('0') 148 #time.sleep(1) 149 value += 1 150 else: 151 #self.x -= Enemy_Move_Space_X 152 print('1') 153 #time.sleep(1) 154 value += 1 155 156 #画像位置の変更 157 cv.coords(self.id, self.x, self.y) 158 #処理を遅らせる 159 root.after(1000, Enemy.move) 160 161 def destroy(self): 162 #画像の消去 163 cv.delete(self.id) 164 165#敵の弾のクラス 166class EnemyBullet: 167 #クラスのインスタンス作成時に起動するメソッド 168 def __init__(self, x, y): 169 self.x = x 170 self.y = y 171 172 def draw(self): 173 #長方形の生成 174 self.id = cv.create_rectangle(self.x-Bullet_Width, self.y+Bullet_Height, self.x+Bullet_Width, self.y-Bullet_Height,fill="red") 175 176 def shoot(self): 177 if self.y <= Window_Height: 178 #画像の移動 179 cv.move(self.id, 0, Bullet_Height) 180 self.y += Bullet_Height 181 #同じクラスのメソッドcollision 182 self.collision() 183 #処理を遅らせる 184 root.after(Bullet_Speed, self.shoot) 185 186 def collision(self): 187 if ((self.x-cannon.x)**2+(self.y-cannon.y)**2) < Collision_Detection: 188 #gameoverメソッド 189 gameover() 190 191 def destroy(self): 192 #画像の消去 193 cv.delete(self.id) 194 195def gameclear(): 196 winflag = 0 197 for enemy in enemies: 198 #敵を倒すたびに数が+1される 199 if enemy.exist == False: 200 winflag += 1 201 202 #倒した敵の数が敵の総数と同じ場合 203 if winflag == Number_Of_Enemy: 204 #good!のテキストを削除 205 cv.delete("good") 206 #Congratulation!テキストの作成 207 cv.create_text(Window_Width//2, Window_Height//2-80, text="Congratulation!",fill="lime", font=("System", Text_Congratulations_Size)) 208 #GameClear!テキストの作成 209 cv.create_text(Window_Width//2, Window_Height//2+20, text="GAME CREAR!", fill="lime", font=("System", Text_GameClear_Size)) 210 211def gameover(): 212 #画像cannon, goodの削除 213 cv.delete("cannon", "good") 214 #GameOverテキストの作成 215 cv.create_text(Window_Width//2, Window_Height//2, text="GAME OVER", fill="red", font=("System", Text_GameOver_Size)) 216 217def enemy_randomshoot(): 218 #ランダムに配列enemiesから選ぶ 219 enemy = random.choice(enemies) 220 #メソッドenemy_shoot 221 enemy.enemy_shoot() 222 #処理を遅らせる 223 root.after(Enemy_Shoot_Interval, enemy_randomshoot) 224 225def numberplus(): 226 global value 227 value = value + 1 228 229if __name__ == '__main__': 230 #初期画面の作成 231 root = tk.Tk() 232 #タイトルの設定 233 root.title('shootingNeo') 234 #キャンバスの作成 235 cv = tk.Canvas(root, width=Window_Width, height=Window_Height, bg='black') 236 #キャンバスの設置 237 cv.pack() 238 239 #砲台の画像の読み込み 240 cannon_Image = tk.PhotoImage(file="canon.png") 241 #敵の画像の読み込み 242 crab_Image = tk.PhotoImage(file="crab.png") 243 244 #メニューバーの作成 245 menubar = tk.Menu(root) 246 #ウィンドウの属性を変更 247 root.configure(menu=menubar) 248 #ウィンドウに子メニューを追加・設定 249 menubar.add_command(label="Quit", underline=0, command=root.quit) 250 251 #クラスCannonのインスタンスを生成 252 cannon = Cannon(Window_Width//2, Cannon_Y) 253 254 #enemy = Enemy() 255 #root.after(1000, enemy.move) 256 257 #for文の中を回すための配列 258 enemies = [] 259 260 for i in range(Number_Of_Enemy): 261 enemy_i = Enemy(i*Enemy_Space_X+50, Enemy_Space_Y) 262 enemies.append(enemy_i) 263 264 #root.after(1000, Enemy.move) 265 266 #GUIアプリの表示 267 root.mainloop()

となります。問題のRoopメソッドが名前は変わりますが141行目のEnemyクラスのmoveメソッドです。
メソッドを呼び出している行が126行目、159行目となります。
※こちらのソースコードはサイト様(https://qiita.com/ell/items/f0f74865c07710f1eab8
)を参考にしていろいろと改変して練習しているものです。
※コメントアウトされているコードは試行錯誤したものが残っているものです。重要性は低いです。

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

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

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

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

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

TakaiY

2023/02/18 11:11

基本的に1の方法でできるはずですが、 1を使ったときに「結果:高速で0と1が出力され」たときのプログラム全体を提示いただけますか。 - どこかで、Roop関数を呼んでいるはずです。 - このRoopの定義ではいくつかエラーが出るので動きません。
C2105

2023/02/18 12:35

TakaiY さん コメントありがとうございます。 うまくここでコードをかけなかったので質問の方に追記しました。 ご迷惑をおかけいたします。
TakaiY

2023/02/18 13:41 編集

やはり、これがちゃんと動いていれば、1秒ごとにRoop関数が呼ばれるはずです。 しかし、このクラス定義だけだと動きませんし、こちらで再現することもできません。 もう一度書きます。 「結果:高速で0と1が出力され」たときのプログラム**全体**を提示いただけますか。 全体が難しければ、現象が再現する最小のプログラムを提示ください。
C2105

2023/02/18 14:06

なるほど… 文章量が多くなると文字数制限とかに引っかからないか、 質問に回答する方のご迷惑にならないか心配だったのですが 全て書く方がよいのですね。 貴重なご助言をいただけてうれしいです>< では質問の最後に追記させていただきます。 お手数をおかけしてしまい申し訳ございません。
guest

回答2

0

ベストアンサー

コードをこちらで実行してみました。

以下の1つの問題点を直すだけで特に問題なく動作していて、1秒ごとに数値が表示されます。
問題とされていた動作は、勘違いなのではないかと。 それについてはコメントしました。

■問題点

  • すでに指摘されていますが、以下の場所は修正が必要です。 そうでないと実行時にエラーになります。
    なっていませんか?

python

1- root.after(1000, Enemy.move) 2+ root.after(1000, self.move)

□ コメント

  • Enemyクラス内で参照している valueはglobalではだめでしょう。
    動作の確認のためにとりあえず入れて入れているのだとは思いますが、これだとたくさん(現状は18)あるEnemyクラスのインスタンスが同じ変数を書き換えてしまいます。なので、 1秒ごとに0101.... と 18個表示されることになります。
    この動作のせいで「#結果:高速で0と1が出力される。」と錯覚しているのではないでしょうか。
    以下のように、この値をインスタンス変数にすることで、0000.. 1111... と 1秒毎に18個ずつ表示されるようになりますよ。 (以下抜粋)

python

1class Enemy: 2 #クラスのインスタンス生成時に起動 3 def __init__(self, x, y): 4 # ***** 略 5 self.value = 0 6 # ***** 略 7 def move(self): 8 if self.exist: 9 if self.value % 2 == 0: 10 #self.x += Enemy_Move_Space_X 11 print('0') 12 self.value += 1 13 else: 14 #self.x -= Enemy_Move_Space_X 15 print('1') 16 self.value += 1

投稿2023/02/19 03:29

編集2023/02/19 10:18
TakaiY

総合スコア12765

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

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

C2105

2023/02/19 10:13

確かにEnemyは18体います! それで高速で動いていると誤認してしまったのですね… そしてglobalだとみんな一緒にvalueを使ってしまうから、 selfでそれぞれ用意してあげるのが正解だった、というわけですね。 ものすごく納得いたしました。 的確な助言、丁寧な解説、とても勉強になりました! TakaiY さん、誠にありがとうございました!
guest

0

def move(self): global value if self.exist: if value % 2 == 0: self.x += Enemy_Move_Space_X print('0') #time.sleep(1) value += 1 else: self.x -= Enemy_Move_Space_X print('1') #time.sleep(1) value += 1 #画像位置の変更 cv.coords(self.id, self.x, self.y) #処理を遅らせる root.after(1000, Enemy.move)

ここの一番下の
「root.after(1000, Enemy.move)」

「root.after(1000, self.move)」
に変えてください。

修正後の全部のコード

import tkinter as tk import random import time value = 0 #ウィンドウの横幅 Window_Width = 600 #ウィンドウの縦幅 Window_Height = 600 Cannon_Y = 550 Enemy_Space_X = 100 Enemy_Space_Y = 60 Enemy_Move_Space_X = 20 Enemy_Move_Speed = 2000 Number_Of_Enemy = 18 Enemy_Shoot_Interval = 200 Collision_Detection = 300 Bullet_Height = 10 Bullet_Width = 2 Bullet_Speed = 10 Text_Good_Size = 10 Text_Congratulations_Size = 50 Text_GameClear_Size = 60 Text_GameOver_Size = 90 #砲台を設定するクラスの定義 class Cannon: #__init__=クラスのインスタンスの生成時自動呼出しされるメソッド def __init__(self, x, y=Cannon_Y): #self=インスタンスを指し示す # self.x = x self.y = y #self.=Class Cannonの中のメソッドを使う self.draw() self.bind() #画像の設置 def draw(self): #tag=設置したイラストに名前を付ける self.id = cv.create_image(self.x,self.y,image=cannon_Image,tag="cannon") #画像にイベントを作成 def bind(self): #ButtonPress-3=右クリック cv.tag_bind(self.id, "<ButtonPress-3>", self.pressed) #Button1-Motion=ウィジェット内でカーソルが動いたとき cv.tag_bind(self.id, "<Motion>", self.dragged) #キャンバス上で右クリックを押したときのイベントメソッド def pressed(self, event): #クラスMyBulletのインスタンスを作成 mybullet = MyBullet(event.x, self.y) #クラスMyBulletのdrawメソッド mybullet.draw() #クラスMyBulletのshootメソッド mybullet.shoot() #キャンバス上でカーソルが動いた時のイベントメソッド def dragged(self, event): #event=イベントの dx = event.x - self.x #coords=指定した画像の座標の変更や情報の取得 self.x, self.y = cv.coords(self.id) #coords(画像の指定, x座標, y座標) cv.coords(self.id, self.x+dx, self.y) self.x = event.x def destroy(self): #delete=指定した画像の消去 cv.delete(self.id) #発射する弾のクラス class MyBullet: #最初に読み込まれるメソッドは__init__とするルールがある def __init__(self, x, y): self.x = x self.y = y #画像の設置 def draw(self): #rectangle=長方形の設置(左上の座標,右下の座標,色の指定) self.id = cv.create_rectangle(self.x-Bullet_Width, self.y+Bullet_Height, self.x+Bullet_Width, self.y-Bullet_Height, fill="blue") def shoot(self): if self.y >= 0: #move=画像の移動(画像の指定,移動するx座標,移動するy座標) cv.move(self.id, 0, -Bullet_Height) self.y -= Bullet_Height #同じクラスのメソッドdefeatを使用 self.defeat() #after=処理を遅らせる(遅らせる秒数,経過後に実行するメソッド) root.after(Bullet_Speed, self.shoot) def defeat(self): for enemy in enemies: if ((self.x-enemy.x)**2+(self.y-enemy.y)**2) < Collision_Detection: #existをFalseに enemy.exist = False #クラスenemyのメソッドdestroy enemy.destroy() #create_text=テキストの作成 cv.create_text(enemy.x, enemy.y, text="good!", fill="cyan", font=("System", Text_Good_Size), tag="good") def destroy(self): #画像の消去 cv.delete(self.id) #敵のクラス class Enemy: #クラスのインスタンス生成時に起動 def __init__(self, x, y): self.x = x % Window_Width self.y = y+x//Window_Width*Enemy_Space_X #existをtrueに self.exist = True #同じクラスのメソッドdraw self.draw() #同じクラスのメソッドmove self.move() def draw(self): #画像の設置 self.id = cv.create_image(self.x, self.y, image=crab_Image, tag="enemy") def enemy_shoot(self): if self.exist: #クラスEnemyBulletのインスタンス生成 enemybullet = EnemyBullet(self.x, self.y) #クラスEnemyBulletのメソッドdraw enemybullet.draw() #クラスEnemyBulletのメソッドshoot enemybullet.shoot() def move(self): global value if self.exist: if value % 2 == 0: self.x += Enemy_Move_Space_X print('0') #time.sleep(1) value += 1 else: self.x -= Enemy_Move_Space_X print('1') #time.sleep(1) value += 1 #画像位置の変更 cv.coords(self.id, self.x, self.y) #処理を遅らせる # root.after(1000, Enemy.move) root.after(1000, self.move) def destroy(self): #画像の消去 cv.delete(self.id) #敵の弾のクラス class EnemyBullet: #クラスのインスタンス作成時に起動するメソッド def __init__(self, x, y): self.x = x self.y = y def draw(self): #長方形の生成 self.id = cv.create_rectangle(self.x-Bullet_Width, self.y+Bullet_Height, self.x+Bullet_Width, self.y-Bullet_Height,fill="red") def shoot(self): if self.y <= Window_Height: #画像の移動 cv.move(self.id, 0, Bullet_Height) self.y += Bullet_Height #同じクラスのメソッドcollision self.collision() #処理を遅らせる root.after(Bullet_Speed, self.shoot) def collision(self): if ((self.x-cannon.x)**2+(self.y-cannon.y)**2) < Collision_Detection: #gameoverメソッド gameover() def destroy(self): #画像の消去 cv.delete(self.id) def gameclear(): winflag = 0 for enemy in enemies: #敵を倒すたびに数が+1される if enemy.exist == False: winflag += 1 #倒した敵の数が敵の総数と同じ場合 if winflag == Number_Of_Enemy: #good!のテキストを削除 cv.delete("good") #Congratulation!テキストの作成 cv.create_text(Window_Width//2, Window_Height//2-80, text="Congratulation!",fill="lime", font=("System", Text_Congratulations_Size)) #GameClear!テキストの作成 cv.create_text(Window_Width//2, Window_Height//2+20, text="GAME CREAR!", fill="lime", font=("System", Text_GameClear_Size)) def gameover(): #画像cannon, goodの削除 cv.delete("cannon", "good") #GameOverテキストの作成 cv.create_text(Window_Width//2, Window_Height//2, text="GAME OVER", fill="red", font=("System", Text_GameOver_Size)) def enemy_randomshoot(): #ランダムに配列enemiesから選ぶ enemy = random.choice(enemies) #メソッドenemy_shoot enemy.enemy_shoot() #処理を遅らせる root.after(Enemy_Shoot_Interval, enemy_randomshoot) def numberplus(): global value value = value + 1 if __name__ == '__main__': #初期画面の作成 root = tk.Tk() #タイトルの設定 root.title('shootingNeo') #キャンバスの作成 cv = tk.Canvas(root, width=Window_Width, height=Window_Height, bg='black') #キャンバスの設置 cv.pack() #砲台の画像の読み込み cannon_Image = tk.PhotoImage(file="canon.png") #敵の画像の読み込み crab_Image = tk.PhotoImage(file="crab.png") #メニューバーの作成 menubar = tk.Menu(root) #ウィンドウの属性を変更 root.configure(menu=menubar) #ウィンドウに子メニューを追加・設定 menubar.add_command(label="Quit", underline=0, command=root.quit) #クラスCannonのインスタンスを生成 cannon = Cannon(Window_Width//2, Cannon_Y) #enemy = Enemy() #root.after(1000, enemy.move) #for文の中を回すための配列 enemies = [] for i in range(Number_Of_Enemy): enemy_i = Enemy(i*Enemy_Space_X+50, Enemy_Space_Y) enemies.append(enemy_i) #root.after(1000, Enemy.move) #GUIアプリの表示 root.mainloop()

投稿2023/02/18 10:26

編集2023/02/18 23:17
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

C2105

2023/02/18 12:17

cm67809733 さん 回答ありがとうございます。 早速試してみたのですが、printの処理並びにフォームの表示すら行われませんでした…泣。 せっかくいただいたご助言を生かすことができず申し訳ございません…。
退会済みユーザー

退会済みユーザー

2023/02/19 02:10 編集

修正しました。 上でコメントされてるように、プログラミングで質問するときは出来るかぎり全部コードをのせてもらえるとありがたいかなと。 省略されている部分にバグあるかもしれないし、再現が面倒なので・・・ (きつい表現があったため編集しました)
C2105

2023/02/19 01:05

cm67809733 さん 追加のコメント並びに修正、ありがとうございます そうだったのですね… 確かに冷静に考えてみればわからない人が省略したコードを見せられても もっとわからなくなるだけですもんね…>< とても勉強になりました。以降はきちんとコードの全文を乗せるようにします! 今はm67809733さんの説明がとても腑に落ちたため 筆をとらせていただきました。 ただ、いただいたコードの確認はバイトが終わってから行うため少し遅れてしまいそうです>< しかし、手を貸していただいた以上きちんと最後までさせていただくつもりです。 待たせてしまうことになり申し訳ないのですが、少々お待ちいただけると幸いです。
退会済みユーザー

退会済みユーザー

2023/02/19 02:10

ありがとうございます。確認お待ちしています。
C2105

2023/02/19 10:06

バイトから帰還したため確認いたしました。 動きました! 同じクラスの中なんですからself使えばよかったですよね… ごちゃごちゃと変えている間にすっかり失念しておりました>< 手早いコメント、的確な回答、とても助かりました! cm67809733 さん、誠にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問