【調査中】Tkinter + CV2 + pyzbarでプログラムがクラッシュする


いきさつ

以前親戚の八百屋(?)に納品した出退勤システムをQRコード対応仕様にアップデートしようとコードを組んでいた所、何やらPythonがクラッシュする自体に陥った

この問題は?

進行中

利用中のPCについて

Macbook Pro 2019年モデル・CPU Intel Core i7・メモリ 16GB・ストレージ1TB(内200GBはBootCampでWindows領域に割り当て)

Dynabook T7(2019年夏モデル)・CPU Intel Core i7 8565U・メモリ 8GB・ストレージ 256GB+1TB デュアルストレージ(家電量販店オリジナルカスタムモデルのため機種のメーカー公式スペックと若干の相違あり)

やりたかったこと

QRコードを読み込み、もし「従業員」なら登録完了音声を鳴らし、もし「来訪者」として登録されていたら、登録完了音声とともにその来訪者とアポを取っている担当の人間の端末に通知する

その際、画面上にTkinterのmessageboxを利用し、「OO様、お待ちしておりました。只今担当の人間を呼び出しております」というような表示をするシステムを作りたかった

状況

QRコードを利用するシステムは作ったことがなかったので、まずは先駆者の方のコードを写経し、それをカスタムして雰囲気を掴み、本格的にアップデート用のプログラムを書いていく作戦にした。
そこで今回は、一番分かりやすかったこちらの方のコードを参考に、以下のようなコードに改造してみた。

qrtest.py
from pyzbar.pyzbar import decode
import cv2
from pygame import mixer
from tkinter import messagebox as mbox

systemonly = ""
cap = cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEX
while cap.isOpened():
    ret,frame = cap.read()
    if ret == True:
        d = decode(frame)
        if d:
            for barcode in d:
                x,y,w,h = barcode.rect
                cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
                barcodeData = barcode.data.decode('utf-8')
                if(systemonly != barcodeData):
                    mixer.init()
                    qrlist = barcodeData.split(",")
                    if(qrlist[1] != "Visitor"):
                        mixer.music.load("sound/recognized.mp3")
                        mixer.music.play(1)
                        systemonly = barcodeData
                    elif(qrlist[1] == "Visitor"):
                        mixer.music.load("sound/visitor.mp3")
                        mixer.music.play(1)
                        mbox.showinfo("Welcome",f"お待ちしておりました。{qrlist[0]}様。\n担当の者が向かいます。しばらくお待ち下さい。")
                        systemonly = barcodeData
        cv2.imshow('QRTEST',frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()

そして「来訪者QR」を読み込ませて発生したエラーが以下のようなもの。

2020-11-30 21:33:22.249 python[2161:55317] -[NSApplication macMinorVersion]: unrecognized selector sent to instance 0x7fb09c47c3a0
2020-11-30 21:33:22.251 python[2161:55317] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSApplication macMinorVersion]: unrecognized selector sent to instance 0x7fb09c47c3a0'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff204b76af __exceptionPreprocess + 242
    1   libobjc.A.dylib                     0x00007fff201ef3c9 objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff20539c85 -[NSObject(NSObject) __retain_OA] + 0
    3   CoreFoundation                      0x00007fff2041f06d ___forwarding___ + 1467
    4   CoreFoundation                      0x00007fff2041ea28 _CF_forwarding_prep_0 + 120
    5   libtk8.6.dylib                      0x000000011ffe7db9 SetCGColorComponents + 265
    6   libtk8.6.dylib                      0x000000011ffe867a TkpGetColor + 250
    7   libtk8.6.dylib                      0x000000011ff22aa9 Tk_GetColor + 153
    8   libtk8.6.dylib                      0x000000011ff128e6 Tk_Get3DBorder + 134
    9   libtk8.6.dylib                      0x000000011ff1274f Tk_Alloc3DBorderFromObj + 127
    10  libtk8.6.dylib                      0x000000011ff23fad DoObjConfig + 941
    11  libtk8.6.dylib                      0x000000011ff23ae5 Tk_InitOptions + 357
    12  libtk8.6.dylib                      0x000000011ff239c5 Tk_InitOptions + 69
    13  libtk8.6.dylib                      0x000000011ff54b5c CreateFrame + 1548
    14  libtk8.6.dylib                      0x000000011ff54e37 TkListCreateFrame + 151
    15  libtk8.6.dylib                      0x000000011ff4c7f8 Initialize + 2168
    16  _tkinter.cpython-38-darwin.so       0x0000000115e7768b Tcl_AppInit + 91
    17  _tkinter.cpython-38-darwin.so       0x0000000115e7734e Tkapp_New + 590
    18  _tkinter.cpython-38-darwin.so       0x0000000115e770ee _tkinter_create_impl + 222
    19  _tkinter.cpython-38-darwin.so       0x0000000115e76bd6 _tkinter_create + 182
    20  python                              0x0000000109e17644 cfunction_vectorcall_FASTCALL + 84
    21  python                              0x0000000109ef0f20 _PyEval_EvalFrameDefault + 45072
    22  python                              0x0000000109ee412d _PyEval_EvalCodeWithName + 557
    23  python                              0x0000000109dbb19a _PyFunction_Vectorcall + 426
    24  python                              0x0000000109db97dd _PyObject_FastCallDict + 93
    25  python                              0x0000000109e3ff52 slot_tp_init + 178
    26  python                              0x0000000109e4f4c1 type_call + 289
    27  python                              0x0000000109db9ad7 _PyObject_MakeTpCall + 167
    28  python                              0x0000000109ef13d1 _PyEval_EvalFrameDefault + 46273
    29  python                              0x0000000109dbb0e8 _PyFunction_Vectorcall + 248
    30  python                              0x0000000109ef0f20 _PyEval_EvalFrameDefault + 45072
    31  python                              0x0000000109ee412d _PyEval_EvalCodeWithName + 557
    32  python                              0x0000000109dbb19a _PyFunction_Vectorcall + 426
    33  python                              0x0000000109ef0f20 _PyEval_EvalFrameDefault + 45072
    34  python                              0x0000000109ee412d _PyEval_EvalCodeWithName + 557
    35  python                              0x0000000109dbb19a _PyFunction_Vectorcall + 426
    36  python                              0x0000000109db97dd _PyObject_FastCallDict + 93
    37  python                              0x0000000109e3ff52 slot_tp_init + 178
    38  python                              0x0000000109e4f4c1 type_call + 289
    39  python                              0x0000000109db9ad7 _PyObject_MakeTpCall + 167
    40  python                              0x0000000109ef13d1 _PyEval_EvalFrameDefault + 46273
    41  python                              0x0000000109ee412d _PyEval_EvalCodeWithName + 557
    42  python                              0x0000000109dbb19a _PyFunction_Vectorcall + 426
    43  python                              0x0000000109ef0e2b _PyEval_EvalFrameDefault + 44827
    44  python                              0x0000000109ee412d _PyEval_EvalCodeWithName + 557
    45  python                              0x0000000109dbb19a _PyFunction_Vectorcall + 426
    46  python                              0x0000000109dba4a9 PyVectorcall_Call + 121
    47  python                              0x0000000109ef1829 _PyEval_EvalFrameDefault + 47385
    48  python                              0x0000000109ee412d _PyEval_EvalCodeWithName + 557
    49  python                              0x0000000109dbb19a _PyFunction_Vectorcall + 426
    50  python                              0x0000000109ef0f20 _PyEval_EvalFrameDefault + 45072
    51  python                              0x0000000109ee412d _PyEval_EvalCodeWithName + 557
    52  python                              0x0000000109f5c346 PyRun_FileExFlags + 358
    53  python                              0x0000000109f5ba91 PyRun_SimpleFileExFlags + 529
    54  python                              0x0000000109f842df pymain_run_file + 383
    55  python                              0x0000000109f839ab pymain_run_python + 523
    56  python                              0x0000000109f83745 Py_RunMain + 37
    57  python                              0x0000000109f84e11 pymain_main + 49
    58  python                              0x0000000109d8d768 main + 56
    59  libdyld.dylib                       0x00007fff20360631 start + 1
    60  ???                                 0x0000000000000002 0x0 + 2
)
libc++abi.dylib: terminating with uncaught exception of type NSException
zsh: abort      python ReleaseObserver.py

おまけにMacからもGUIで警告が表示されている。こんな感じの↓

こんな親切に出してくれているのに、同じエラーが出ている人間が殆ど居ない上に原因がわからないしmessageboxを表示させなければエラーが出ないものだから、段々と腹が立ってきた。
実は似たようなエラーはゴロゴロと転がってはいるものの、どれも私のMacで発生したエラーとは異なる。
私のエラーの2行目、この部分↓

'-[NSApplication macMinorVersion]: 

大抵同じようなエラーが発生している人は、同じ部分がこの様になっている↓

'-[NSApplication _setup:]:

macMinorVersionというエラーは相当珍しいということを発生件数が物語っている。

いろいろ試した。MatplotlibとTkinterが喧嘩してるのではとか(そもそも使ってないけど、内部的に似たようなもの使っているのかも?という淡い期待を込めて)、tkaggがどうとか、とにかく目に入るものすべてを試したが動作せず。

当たり前。エラーがそもそも違うのだから、対処法も違うに決まっている。

仮説

上のエラーにはmacMinorVersionという文言が表示されている。

私はちょっぴりこれに対して心当たりがある。

というのも、11月12日(日本時間では確か13日)、リリース日当日にMacOSをBigSurにアップデートしているのだ。

別に仕事じゃないし、どうせ不具合なんか起きてもCatalinaに戻せばいいや〜、なんて軽く考えていた。

もしかしたらこれが原因かもしれない。

実験

幸いにも、私はWindowsマシンの「Dynabook」を所有している。

今回はこのDynabookを用いて検証していこう・・・と思ったが、WindowsではPyzbarがバグって動作しない。現在こちらの問題も調査中。

何がしたかったか

とりあえずまずこんなエラーが出ているということを共有したかった。

解決策をご存じの方は是非教えて下さい。

引き続きこの問題を調査していきます。

何か分かったら追記します。 P