実現したいこと
threadingを使用してdoorとmainの処理を行い、mainではtkinterに画像を表示し、doorではラズベリーパイに接続したスイッチがON(センサーがくっついた状態)であればOFFになるまで何もせず待機し、OFF(センサーが離れた状態)になったらtkinterのウィンドウを閉じるというプログラムを作りたい。
発生している問題・エラーメッセージ
RuntimeError: main thread is not in main loopやAttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'%Run doortest.pyというエラーが発生し、door側のプログラムが上手く動作しない。
Exception in thread Thread-2: Traceback (most recent call last): File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner self.run() File "/usr/lib/python3.7/threading.py", line 865, in run self._target(*self._args, **self._kwargs) File "/home/pi/ securepy/doortest.py", line 37, in main img = ImageTk.PhotoImage(img) File "/usr/lib/python3/dist-packages/PIL/ImageTk.py", line 117, in __init__ self.__photo = tkinter.PhotoImage(**kw) File "/usr/lib/python3.7/tkinter/__init__.py", line 3545, in __init__ Image.__init__(self, 'photo', name, cnf, master, **kw) File "/usr/lib/python3.7/tkinter/__init__.py", line 3501, in __init__ self.tk.call(('image', 'create', imgtype, name,) + options) RuntimeError: main thread is not in main loop Exception ignored in: <function PhotoImage.__del__ at 0xb5e1ff18> Traceback (most recent call last): File "/usr/lib/python3/dist-packages/PIL/ImageTk.py", line 123, in __del__ name = self.__photo.name AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'%Run doortest.py
該当のソースコード
python
1import sys 2import threading 3import time 4import tkinter 5from subprocess import run 6from PIL import Image, ImageTk 7import RPi.GPIO as GPIO 8 9global root 10 11GPIO.setmode(GPIO.BCM) 12GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP) 13sw_status = 1 14 15def door(): 16 root = tkinter.Tk() 17 while True: 18 try: 19 sw_status = GPIO.input(18) 20 if sw_status == 0: 21 pass 22 else: 23 break 24 25 time.sleep(2) 26 except: 27 break 28 GPIO.cleanup() 29 root.destroy() 30 sys.exit() 31 32def main(): 33 root = tkinter.Tk() 34 img = Image.open('img3.png') 35 img = ImageTk.PhotoImage(img) 36 canvas = tkinter.Canvas(bg="black", width=600, height=300) 37 canvas.place(x=0, y=0) 38 canvas.create_image(0, 0, image=img, anchor=tkinter.NW) 39 40 root.mainloop() 41 42if __name__ == '__door__': 43 root = tkinter.Tk() 44 door() 45 46if __name__ == "__main__": 47 thread_1 = threading.Thread(target=door) 48 thread_2 = threading.Thread(target=main) 49 50 thread_1.start() 51 thread_2.start()
試したこと
door側のプログラムにroot.mainloop()を追加することで動くかと思われたが、見かけ上は動いているがセンサーがOFF状態になってもウインドウが閉じられなかった。
何がいけないのか分からず完全にお手上げ状態となってしまったので、どなたかわかる方にどこに何を追加したらいいのか教えていただきたいです。
補足情報(FW/ツールのバージョンなど)
Python 3.7.3
回答1件
あなたの回答
tips
プレビュー