いきさつ
以前親戚の八百屋(?)に納品した出退勤システムを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コードを利用するシステムは作ったことがなかったので、まずは先駆者の方のコードを写経し、それをカスタムして雰囲気を掴み、本格的にアップデート用のプログラムを書いていく作戦にした。
そこで今回は、一番分かりやすかったこちらの方のコードを参考に、以下のようなコードに改造してみた。
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