前提・実現したいこと
PySimpleGUIでスレッド処理にてカウント実行しながらwindowの画像表示をループさせたい。
①下記デスクトップアプリに横棒の画像を表示させているのが初期状態で、Startをクリックすると、パラパラアニメとして横棒が下に移動していきます。(1~5.pngを用意しています。)
②上記パラパラが動きつつ、別スレッドでカウントwhileメソッドが動き続けます。
環境
OS:windows10
language:Python3.7
Library:PySimpleGUI,threading
発生している問題・エラーメッセージ
トラブル1:スレッドが正常に実行できない。
AttributeError: 'str' object has no attribute 'window'
該当のソースコード
python
1import threading 2import time 3import sys 4import PySimpleGUI as sg 5 6def play_count(fname): 7 str_num = 0 8 while True: 9 str_num += 1 10 time.sleep(1) 11 print(str_num) 12 13def play_anime(self): 14 n_count = 0 15 n_times = 0 16 while True: 17 # time.sleep(2) 18 # n_count += 3 19 # print('aaaaaaaa:', n_count) 20 # ここはなんとか1.png 2.png 3.png 4.png 5.pngを代入しようとした 21 if n_count == 5: 22 n_times += 1 23 if n_count > 5: 24 if n_count % 5 == 0: 25 n_times += 1 26 n_count += 1 27 n_count_last = n_count - 5 * n_times 28 29 print('./' + str(n_count_last) + '.png') 30 31 self.window['-image_canvas-'].Update(filename = './' + str(n_count_last) + '.png') 32 33 34 35if __name__ == '__main__': 36 #ウインドウの表示、設定 37 sg.theme('BluePurple') 38 layout = [ 39 [sg.Text('処理の実行、変更、停止を行います:'),sg.Text(size=(15,1), key='-OUTPUT-')], 40 [sg.Button('Start'),sg.Button('exchange')], 41 [sg.Image('./1.png', key='-image_canvas-')] 42 ] 43 window = sg.Window('Pattern 2B', layout) 44 45 #スレッド処理のインスタンス生成 46 # = Receive(window) 47 def startEvent(event):#スタートボタン押下時の処理 48 #r.ROOP = True 49 #r.start() 50 51 DATA = "arg" 52 thread3 = threading.Thread(target=play_count, args=[DATA]) 53 thread4 = threading.Thread(target=play_anime, args=[DATA]) 54 55 thread3.start() 56 thread4.start() 57 58 thread3.join() 59 thread4.join() 60 61 62 n_count = 0 63 n_times = 0 64 #rotation_flag = False 65 while True: 66 event , values = window.read() 67 #ボタンの処理内容 68 if event == 'Start': 69 window['-OUTPUT-'].update('実行中') 70 # rotation_flag = True 71 startEvent(event) 72 73 if event == 'exchange': # UP ボタンを押したら画像切り替え 74 75 if n_count == 5: 76 n_times += 1 77 78 if n_count > 5: 79 if n_count % 5 == 0: 80 n_times += 1 81 82 n_count += 1 83 n_count_last = n_count - 5 * n_times 84 window['-image_canvas-'].Update(filename = './' + str(n_count_last) + '.png') 85 86 # if rotation_flag == True: 87 # time.sleep(3) 88 # print('rotation_flag if 内部') 89 # if n_count == 5: 90 # n_times += 1 91 92 # if n_count > 5: 93 # if n_count % 5 == 0: 94 # n_times += 1 95 96 # n_count += 1 97 # print('n_count:', n_count) 98 # n_count_last = int(n_count) - 5 * n_times 99 # print('n_count_last:', n_count_last) 100 # #self.window['-image_canvas-'].update(filename = './2.png') 101 # window['-image_canvas-'].Update(filename = './' + str(n_count_last) + '.png')
試したこと
ソースコードの一番下の場所で今コメントアウトになっているところなのですが、そこでwindowを更新すればよいのではと思い試しました。当初、play_animeメソッド内で windowのupdateをいくらしても、windowsが更新されないのであれば、意味がないのだと思い、この更新メソッドを一番下に記載しました。
ところが、startEventメソッドに行き、スレッド実行2つが始まったら、もはや今のソースの箇所は読み込まれず、結局実現できませんでした。何かアドバイス頂けないでしょうか。よろしくお願いいたします。
2021/12/8 20:33 追記
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/08 11:35