俺言語。

自分にしか理解できない言語で書かれた備忘録

【Python】Pycharm + wx3 でエラー

PycharmのPython Console使用時に発生したエラー。

おそらくbackednをpyqt4からwxに変更したことも関係あると思われる。

C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2017.1\helpers\pydev\pydev_ipython\inputhookwx.py

def inputhook_wx3():
    """Run the wx event loop by processing pending events only.

    This is like inputhook_wx1, but it keeps processing pending events
    until stdin is ready.  After processing all pending events, a call to
    time.sleep is inserted.  This is needed, otherwise, CPU usage is at 100%.
    This sleep time should be tuned though for best performance.
    """
    # We need to protect against a user pressing Control-C when IPython is
    # idle and this is running. We trap KeyboardInterrupt and pass.
    try:
        app = wx.GetApp()  # @UndefinedVariable
        if app is not None:
            assert wx.IsMainThread()  # @UndefinedVariable

            # The import of wx on Linux sets the handler for signal.SIGINT
            # to 0.  This is a bug in wx or gtk.  We fix by just setting it
            # back to the Python default.
            if not callable(signal.getsignal(signal.SIGINT)):
                signal.signal(signal.SIGINT, signal.default_int_handler)

            evtloop = wx.GUIEventLoop()  # @UndefinedVariable
            ea = wx.EventLoopActivator(evtloop)  # @UndefinedVariable
            t = clock()
            while not stdin_ready():
                while evtloop.Pending():
                    t = clock()
                    evtloop.Dispatch()
                #app.ProcessIdle()
                wx.WakeUpIdle()

wx3になって
wx.Thread_IsMain() が wx.IsMainThread に変更されているのに
プログラム内ではwx2のままが原因。

ほかにも
wx.EventLoop() が wx.GUIEventLoop() を使うよう推奨されていたので変更した。

【Python】Pycharmアップデート後にPythonクラッシュ多発

Pycharmはずっと2016.3バージョンを使っていたが知らぬ間に2017.1という新バージョンに。

機能もデバッグの高速化とPandasの可視化と魅力的だったため
アップデートしたところ,前は普通に動いていたプログラムが立て続けに
Pythonのcrashで動かず。。

その時のエラーは
コンソールに
Process finished with exit code -1073741819 (0xC0000005)

"Pythonは動作を停止しました"
というウィンドウ。

色々原因を調べていくとmatplotlibをインポートするところで
エラーが発生。

インストールされていたmatplotlibのバージョンが1.*で
2.0.0が新たに公開されていたので試しに更新したところ直った!

【Python】リスト内包表記の戻り値はリスト

知らなかった。

連続で処理したものをリストでもっておきたい時に便利。
たとえば グラフウィンドウ内にgridspecを使って大量にaxesを設定する場合

row = 4
line = 4
gs = gridspec.Gridspec(row, line)
ax = [fig.addsubplot(gs[num]) for num in row * line]

ax[0].plot(...) 

辞書内包表記もあるのでそちらの戻り値はおそらくディクショナリ。

【Python】wxFormBuilderがwxPython3に対応できていない部分

wxFormBuilderで作ったGUIはwxPython2までしか対応していないせいか
wxPython3だとエラーでうまく動かいない場合があり。

変更(修正)が必要な項目のまとめ。

【バージョン】
wxformbuilder:3.5.1-RC1(Unicode)
wxPython-Phoenix: 3.0.3dev2749+f803d20


【要変更箇所】
・グリッドのセル中身を変更したときに発生するイベント
wx.grid.EVT_GRID_CELL_CHANGE → wx.grid.EVT_GRID_CELL_CHANGED


<追記>
下記にwx2からwx3になった際に変更になったクラスと関数のリスト。
何故か上記は含まれず。

https://wxpython.org/Phoenix/docs/html/classic_vs_phoenix.html#introduction

【Python】Pycharm設定覚書き

・行数の表示 - ON
・メソッド間の区切り線 - ON
・スペースの可視化 - ON
f:id:hukkuramamemoti:20170203191513j:plain

・補完は大文字小文字を区別するか - None(しない)
f:id:hukkuramamemoti:20170203191554j:plain

・スペルチェック - OFF(しない) これがONだと適当な変数名にいちいちアラートが出る。
f:id:hukkuramamemoti:20170203191648j:plain

・dict型を記述する際の配置 - Align on colon(コロン位置を合わせる)
f:id:hukkuramamemoti:20170203191848j:plain

・同じ変数名をハイライト 割とよく使うので分かりやすい色の方がいい
f:id:hukkuramamemoti:20170203192007j:plain

ブレークポイントを例外発生時に設定 呼び出し元への変数も参照可能なので便利
Runタブ|View Breakpoints で下記画面,チェックを入れる
https://www.jetbrains.com/help/pycharm/2016.3/creating-exception-breakpoints.html

f:id:hukkuramamemoti:20170313213721j:plain

【Python】cx_Freezeでexeファイルを作成した時のエラー

Python2.7から3.5に移行して,py2exeが使えなくなってしまったので

代わりにcx_Freezeを使った時のエラー


エラー発生時のキーワードは KeyError: 'TCL_LIBRARY'
(何故かエラー再現できなくなってしまった…。)

解決方法はsetup.pyに下記を記載すること

import os
os.environ['TCL_LIBRARY'] = "C:\\Users\\user_name\\AppData\\Local\\Programs\\Python\\Python35\\tcl\\tcl8.6"
os.environ['TK_LIBRARY'] = "C:\\Users\\user_name\\AppData\\Local\\Programs\\Python\\Python35\\tcl\\tk8.6"

どうもTkが見つからずエラーが出ているようで

上記アドレスを環境変数に入れてあげれば解決。


下記が参考になりました↓
stackoverflow.com

【Arduino,C】文字宣言時にオーバーフロー?

オーバーフローといっていいのかよくわからないけど

文字宣言のところで変数の意味が分かるように掛け算で数値を代入したとき,具体的には

unsigned long time_millisec = 135 * 1000 //msec

としてミリ秒にするため1000をかけて代入したところなぜか代入された変数は

println(time_millisec)
> 3928

なってどハマリした。


よくよく調べると整数の定数はint型なので

int(135) * 1000

135000だけどintは2byte(65536)なので2周回って
13500 - 65536 = 69464 ←まだint型より大きい
69464 - 65536 = 3928

となってしまった。

これは普通に

unsigned long time_millisec = 135000

とすれば起きない現象。

要注意。


こちらが参考になりました↓
Arduino 日本語リファレンス