前提・実現したいこと
Python初心者です。
PythonでTkinterを使用し、ボタンを押すとDiscordのRichPresenceを用いてステータスにPC情報等を表示するプログラムを作ろうと思い最初にthreadingを使わずにプログラムを書いたのですが、ボタンを押し、有効化するとフリーズして強制終了してしまします。そこでthreadingを使うとフリーズしなくなると聞いたのでthreadingを使用しプログラムを書いてみたのですが、エラーが発生してしまいます。
発生している問題・エラーメッセージ
C:\Users\ユーザー名\PycharmProjects\test\venv\Scripts\python.exe C:/Users/ユーザー名/PycharmProjects/test/python2.py Exception in thread Thread-1: Traceback (most recent call last): File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 916, in _bootstrap_inner self.run() File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 864, in run self._target(*self._args, **self._kwargs) File "C:/Users/ユーザー名/PycharmProjects/test/python2.py", line 17, in rp RPC = Presence(client_id, pipe=0) File "C:\Users\ユーザー名\PycharmProjects\test\venv\lib\site-packages\pypresence\presence.py", line 13, in __init__ super().__init__(*args, **kwargs) File "C:\Users\ユーザー名\PycharmProjects\test\venv\lib\site-packages\pypresence\baseclient.py", line 37, in __init__ self.update_event_loop(self.get_event_loop()) File "C:\Users\ユーザー名\PycharmProjects\test\venv\lib\site-packages\pypresence\baseclient.py", line 80, in get_event_loop loop = asyncio.get_event_loop() File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python36-32\lib\asyncio\events.py", line 694, in get_event_loop return get_event_loop_policy().get_event_loop() File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python36-32\lib\asyncio\events.py", line 602, in get_event_loop% threading.current_thread().name) RuntimeError: There is no current event loop in thread 'Thread-1'.
該当のソースコード
Python
1import psutil 2from pypresence import Presence 3import time 4import platform 5import tkinter as tk 6from tkinter import messagebox as mbox 7import threading 8 9root = tk.Tk() 10root.geometry("500x300") 11 12client_id = 'クライアントID' 13 14n = "\n" 15 16starttime = time.time() 17 18def rp(): 19 RPC = Presence(client_id, pipe=0) 20 RPC.connect() 21 mbox.showinfo("info", "ステータス表示を有効化しました") 22 while True: 23 cpu_per = round(psutil.cpu_percent(), 1) 24 mem_per = round(psutil.virtual_memory().percent, 1) 25 RPC.update(start=int(starttime), details="メモリ使用率: " + str(mem_per) + "%", state="CPU使用率:"+str(cpu_per)) 26 time.sleep(1) 27 28 29def callback(): 30 th = threading.Thread(target=rp) 31 th.start() 32 33 34 35button1 = tk.Button(text="有効化", font=("", 30), width=15, height=5, command=callback) 36button1.pack() 37 38root.mainloop() 39
補足情報(FW/ツールのバージョンなど)
Windows10 64bit
Python3.6
RichPresenceの表示にはpypresenceを使用してます。
###追記
threadingからmultiprocessingに変えたところ、起動しボタンを押してrichpresenceを有効化するところまではできたのですが、そこで新しいウインドウが開きそれがフリーズしてしまいます。
最初に開いたウインドウはフリーズしていません。
https://stackoverflow.com/questions/46674498/tkinter-is-opening-multiple-gui-windows-upon-file-selection-with-multiprocessing
調べてみたところ上記のような情報が見つかり試してみたのですが、特に変わりはありませんでした。
以下変更後のソースコードです。
Python
1import psutil 2from pypresence import Presence 3import time 4import tkinter as tk 5from tkinter import messagebox as mbox 6import multiprocessing 7 8 9client_id = 'クライアントID' 10 11n = "\n" 12 13starttime = time.time() 14 15def rp(): 16 RPC = Presence(client_id, pipe=0) 17 RPC.connect() 18 mbox.showinfo("info", "ステータス表示を有効化しました") 19 while True: 20 cpu_per = round(psutil.cpu_percent(), 1) 21 mem_per = round(psutil.virtual_memory().percent, 1) 22 RPC.update(start=int(starttime), details="メモリ使用率: " + str(mem_per) + "%", state="CPU使用率:"+str(cpu_per)) 23 time.sleep(1) 24 25 26def callback(): 27 mp = multiprocessing.Process(target=rp) 28 mp.start() 29 30 31if __name__ == "__main__": 32 root = tk.Tk() 33 root.geometry("500x300") 34 35 button1 = tk.Button(text="有効化", font=("", 30), width=15, height=5, command=callback) 36 button1.pack() 37 38 root.mainloop()
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/14 12:51
2020/05/14 12:54
2020/05/14 12:58
2020/05/14 12:59
2020/05/14 13:33