トップページに戻る

python tips 開発者向け

 D2MatE拠点メンバー及び関係者には、Webexメッセージにプログラミング等の質問サイト "東工大MDX-PYTHON質問箱” が用意されています。
pythonやプログラミングに限らず、回答できる質問には対応し、必要に応じてこのページで公開します。

 下記tipsのいくつかは、tklib (tkApplication、tkFit、tkFit_m、tkPlotEvent など) に実装されています 


プログラム開発者 (特に tkinter、matplotlib)のTips

02-python-tips.pdf

以下の資料が含まれています


モジュールにおけるテスト

 モジュールを単独で実行する場合だけ特定の関数を呼び出すには、__name__ 変数を利用します。
モジュールプログラムから実行した場合は __name__ に "__main__" が入りますが、他のプログラムから import された場合は、そのモジュール名が入ります。
そのため、以下の構文により、モジュールが単独で実行された時だけ main() 関数を呼び出すことができます。 
モジュールの場合、main() 関数にモジュール関数・クラスのテストプログラムを書いておくと便利です。

void main():
  ...

if __name__ == "__main__":
   main()


変数型の型


オブジェクトの属性へのアクセス


ctrl-cによる割り込み

解決方法: signalモジュールの signal.signal() 関数で handler関数を設定する

注: scipy.optimizeでは、ライブラリ内で割り込み設定をしている様子。使えない

import signal

class tkStopHandler():
    def __init__(self):
    self.stop_flag = False

def __call__(self, signal, frame):
    while 1:
        print("")
        print("Type 'yes' if terminates the program>> ", end = '')
        keyin = input()
       if keyin == 'yes':
            print(" Stopping")
            self.stop_flag = True
            return True
       else:
            print(" Cancelled")
            break

       return True

stop_hander = tkStopHandler()
signal.signal(signal.SIGINT, stop_hander)

# ctrl-cの割り込みテスト: ここまで
#while(True):
#   if stop_hander.stop_flag:
#       exit(0)


matplotlibによるインタラクティブプログラミング

 matplotlibはpythonの標準的なグラフ作成モジュールです。matplotlibのwindowでは、Tk のイベントを使ってインタラクティブなプログラムを作ることができます。
グラフ中のデータ点をクリックした際に、データ情報をコンソールに表示する疑似コードを以下に示します。

# x, y にデータのリストを入れて、グラフを描画します
fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1)
ax1.plot(x, y)

# グラフを表示しますが、plt.show() を使うとプログラムが停止してしまうため、plt.pause() を使います。
# グラフは再描画されますが、プログラムは継続します
plt.pause(0.1)

# データの集合 (xlist, ylist) のうちから、データ (x,y) に一番近いindexを探して返します。
def find_nearest_data(x, y, xlist, ylist):
  minr2 = 1.0e300 
  ihit = None 
  for i in range(len(xlist)): 
    xi = xlist[i]
    yi = ylist[i] 
    r2 = (x - xi)**2 + (y - yi)**2 
    if minr2 > r2:
      minr2 = r2 
      ihit = i 

  return ihit, minr2

# マウスの左ボタンがクリックされたときに呼び出されます。
def onclick(event):
# event.inaxesに、クリックされた位置が含まれる axis 変数が返されます。
# ax1 内でクリックされた場合だけ次の処理をします。
  if event.inaxes != ax1:
    return

# (event.xdata, event.ydata)に、ax1に対応する (x, y) の値が入っています
# データの集合 (x, y) のうちから、データ (xe, ye) に一番近いindexを取得します
  idx, r2 = find_nearest_data(event.xdata, event.ydata, x, y)
  print("")
# クリックした点に一番近いデータ (x[idx], y[idx]) をコンソールに表示します。
  print(f"clicked at idx = {idx}: x = {x[idx]}  y = {y[idx]}")

# マウスの左ボタンクリックイベント button_press_event を onclick() に紐づけます (bind) 
fig.canvas.mpl_connect("button_press_event", onclick) 

# plt.pause()を使うとプログラムが最後まで進行してしまうので、input() 関数を呼ぶことで、
# ENTERを入力するまでプログラムの終了を待ち状態にします
print("")
print("Press ENTER to terminate")
input()