@KITSHIN (秀一 南野)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Python スレッドのエラー Exception in thread Thread

import datetime , os
import tkinter as tk
import threading
import win32com.client

def counter():
    class Timer:
        def __init__(self):
            self.root = tk.Tk()
            self.label = tk.Label(self.root)
            self.label["font"] = ("Helvetica", 25)
            self.label["bg"] = "blue"
            self.label["fg"] = "white"
            self.label.grid(column=0, row=0)
            self.root.title(u'処理時間まで')
        def changeLabelText(self):
            while True:
                acttime = datetime.datetime.combine(datetime.date.today(), datetime.time(13,18,0))
                nowtime = datetime.datetime.now()
                ato = acttime - nowtime
                atoh = int(ato.seconds / 3600)
                atom = int((ato.seconds / 3600 - int(ato.seconds / 3600)) * 60)
                ctntxt = '処理時間まであと' + str(atoh) + '時間' + str(atom) + '分'
                self.label["text"] = ctntxt
                if atoh + atom == 0:
                    Excel = win32com.client.Dispatch('Excel.Application')
                    Excel.Visible = True
                    Excel.DisplayAlerts = False
                    filename = '照合.xlsm'
                    fullpath = os.path.join(os.getcwd(), filename)
                    wb = Excel.Workbooks.Open(Filename=fullpath)
                    wb.Close(SaveChanges=False)
    if __name__ == "__main__":
        timer = Timer()
        thread1 = threading.Thread(target=timer.changeLabelText)
        thread1.start()
        timer.root.mainloop()
counter()

上記のコードを実行したところ・・・

Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Users\USER\anaconda3\envs\PJ1\lib\site-packages\win32com\client\dynamic.py", line 81, in _GetGoodDispatch
IDispatch = pythoncom.connect(IDispatch)
pywintypes.com_error: (-2147221008, 'CoInitialize は呼び出されていません。', None, None)

というエラーが出て処理が進められません
原因回避方法をご教授いただきますよう何卒よろしくお願いいたします
0 likes

1Answer

ソースコードについて

回答でなく申し訳ありません。

  • ソースを貼り付ける際に、「```py」の行で始めると、pythonの文法に基づいて着色されて読みやすくなります。

エラーについて (追記)

問題のエラーは、threadingを使うことで生じていると思います。
シンプルに、以下のような方法ではいかがでしょうか?

import datetime
import tkinter as tk

class Timer(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.master.title(u'処理時間まで')
        self.label = tk.Label(self.master)
        self.label["font"] = ("Helvetica", 25)
        self.label["bg"] = "blue"
        self.label["fg"] = "white"
        self.label.grid(column=0, row=0)
        self.update() # 最初の呼び出し
    def update(self):
        acttime = datetime.datetime.combine(datetime.date.today(), datetime.time(13,18,0))
        nowtime = datetime.datetime.now()
        ato = acttime - nowtime
        atoh = int(ato.seconds / 3600)
        atom = int(ato.seconds % 3600 / 60)
        atos = int(ato.seconds % 60)
        ctntxt = f"処理時間まであと{atoh}時間{atom}{atos}"
        self.label["text"] = ctntxt
        if atoh + atom == 0:
            Excel = win32com.client.Dispatch('Excel.Application')
            Excel.Visible = True
            Excel.DisplayAlerts = False
            filename = '照合.xlsm'
            fullpath = os.path.join(os.getcwd(), filename)
            wb = Excel.Workbooks.Open(Filename=fullpath)
            wb.Close(SaveChanges=False)
        self.master.after (1000, self.update) # 1000ミリ秒後に自身を呼び出して貰う

if __name__ == "__main__":
    root = tk.Tk()
    timer = Timer(root)
    timer.mainloop()
0Like

Comments

  1. @KITSHIN

    Questioner

    アドバイスいただきありがとうございます。
    参考にさせていただき、修正ができました。
  2. 見やすくなりましたね。
    あと、コードの次の行に「```」があれば、コード表示がそこで終わります。

    回答本文に追記いたしました。
  3. @KITSHIN

    Questioner

    ご回答を参考にさせていただいたら、実行できました!
    色々調べたり、聞いたりしても回答を得ることができずにとても困っていたので、本当に助かりました!
    今回いただいたコードをじっくり読み解いて身につけたいと思います。
    質問の中のコードの記載方法等も教えていただきありがとうございました。
    また、何卒よろしくお願い致します。

Your answer might help someone💌