前提・実現したいこと
一定時間ごとに、ランダムに画像を表示するプログラムを作りたいのですが、自動更新が反映されません。
10の画像があり、それぞれ「0.gif~9.gif」と名前がついています。数字を3つ読み込み、それに対応する画像を表示させたいと考え、以下をつくりました。
キー入力があれば動くのですが、ランダムな数字生成をすると、画像が表示されません。スタート後はキー入力なしで恒久的に動かしたいのですが、どのような処理を入れれば実現するでしょうか。
発生している問題・エラーメッセージ
エラーメッセージはありません
該当のソースコード
python
1import tkinter as tk 2from PIL import Image, ImageTk 3import re 4import random 5import time 6 7#~ウィンドウやcanvasの表示設定いろいろ~ 8 9while True: 10 11 time.sleep(1.0) 12 nom1=str(random.randrange(0,10,1)) +"g.gif" 13 nom2=str(random.randrange(0,10,1)) +"g.gif" 14 nom3=str(random.randrange(0,10,1)) +"g.gif" 15 16 #画像表示 17 img1 = tk.PhotoImage(file=nom1) 18 canvas1.create_image((cv_width_100//2), (cv_height//2), image=img1) 19 20 img2 = tk.PhotoImage(file=nom2) 21 canvas2.create_image((cv_width_nom//2), (cv_height//2), image=img2) 22 23 img3 = tk.PhotoImage(file=nom3) 24 canvas3.create_image((cv_width_nom//2), (cv_height//2), image=img3) 25 26root.mainloop() 27
試したこと
ランダムな数字生成の前段階として、randrangeのかわりに
nom1 = str(input('No.1:')) +'g.gif' nom2 = str(input('No.2:')) +'g.gif' nom3 = str(input('No.3:')) +'g.gif'
でそれぞれの数字を手入力したり、randrangeの前に
start=input('enter:')
を入れてキー入力をすれば、問題なく更新されます。
nom1=str(random.randrange(0,10,1)) +"g.gif" nom2=str(random.randrange(0,10,1)) +"g.gif" nom3=str(random.randrange(0,10,1)) +"g.gif"
の下にprint文を入れ、ファイル名を生成するところまではできていることは確認できました。
補足情報(FW/ツールのバージョンなど)
python3.7
よろしくお願いいたします。
while True: から抜けない限り
root.mainloop() が実行されないと思うのですが、なにか省略してるんでしょうか。
問題なければ全コード頂けると、私の環境でも実行してみます。
ご回答、ありがとうございます!上部のコードが未整理で、ちょっとごちゃごちゃしているのですが、このような感じで書いてあります。
import tkinter as tk
from PIL import Image, ImageTk
import random
#import time
#画像ファイルのサイズ指定
cv_height = 400
cv_width_nom = 200
cv_width_100 = 200
v_margin = 50
h_margin = 20
cv_width_point = 60
cv_width_g = 200
cv_width_title = (cv_width_100 + cv_width_nom*3 + cv_width_point + cv_width_g)
cv_height_title = 140
canvasline = 0
root = tk.Tk()
root.title("")
root.configure(width=1024,height=600,bg='white')
#キャンバス配置
canvas1 = tk.Canvas(bg="white", width=cv_width_100, height=cv_height, highlightthickness=canvasline)
canvas1.place(x=v_margin, y=(h_margin*2+cv_height_title))
canvas2 = tk.Canvas(bg="white", width=cv_width_nom, height=cv_height, highlightthickness=canvasline)
canvas2.place(x=(v_margin+cv_width_100), y=(h_margin*2+cv_height_title))
canvas3 = tk.Canvas(bg="white", width=cv_width_nom, height=cv_height, highlightthickness=canvasline)
canvas3.place(x=(v_margin+cv_width_100+cv_width_nom), y=(h_margin*2+cv_height_title))
while True:
# nom1 = str(input('No.1:')) +'g.gif'
# nom2 = str(input('No.2:')) +'g.gif'
# nom3 = str(input('No.3:')) +'g.gif'
# start=input('enter:') #入れれば動く
nom1=str(random.randrange(0,10,1)) +"g.gif"
nom2=str(random.randrange(0,10,1)) +"g.gif"
nom3=str(random.randrange(0,10,1)) +"g.gif"
#画像表示
img1 = tk.PhotoImage(file=nom1)
canvas1.create_image((cv_width_100//2), (cv_height//2), image=img1)
img2 = tk.PhotoImage(file=nom2)
canvas2.create_image((cv_width_nom//2), (cv_height//2), image=img2)
img3 = tk.PhotoImage(file=nom3)
canvas3.create_image((cv_width_nom//2), (cv_height//2), image=img3)
root.mainloop()
whileのループから抜けないといけないこと、firedfyさまとmoredeepさまのご回答から理解いたしました。
ループ内で文字入力していたときは動いていたので、「ループから抜けられていない」という認識になっておりませんでした…。

回答1件
あなたの回答
tips
プレビュー