「Python」カテゴリーアーカイブ

Python言語関連

Python tkinterのComboboxを連動させたい!

前提

Pythonのtkinterを使用してComboboxを2つ作成しました。
1つ目のComboboxで選択された内容に従って、2つ目のComboboxに設定されている値を変更したいというのが今回のお題です。

サンプルソース

このサンプルプログラムでは、「Select 1」のコンボボックスを選択しても「Select 2」の値は変化しません。

bindの中で指定しているcb2.set()がファンクションとして処理されていないようです。

結果

以下の様に変更しました。

この部分を以下の様に変更しました。

cb1.bindで指定しているcb2.set()をlambdaで無名関数とすることで、関数として処理されます。

cb2.baind側のprint()は処理されているのですが、敢えて同様にlambdaで無名関数とすることで、プログラムソースの統一をしていますが、敢えて変更しなくても動作します。

関数を指定するところでは、明確にdefで関数を作るか、lambdaで無名関数として定義することが望ましいということの様です。

引っ掛かったので記録として残しておきます。

ファイルやディレクトリの変更をトリガーにしてプログラムを起動する。incronがダメなら、inotifyで!

ファイルやディレクトリを監視したい!

ここでも過去に取り上げていますが、incronを用いて任意に指定するファイルやディレクトリの更新を監視することが出来ます。
ところが、incronは何度かバグが発生し、且つ、メンテナンスが遅れ遅れになっていることもあり、利用することを断念しました。

systemdでサポートされているinotifyを利用する手段が次に出てきた訳ですが、当初は情報も少なくて困ったものです(^^ゞ

というところで、CentOS 7上のPython 3で利用できるか確認してみました。

結論としては、Python 2.xと比較して、ほぼデフォルト状態のPython 3で利用することが出来ました。

どんなイベントを監視できるのか?

いろんなイベントを監視できるので、詳細についてはmanで確認できます。

サンプルコード

ここで示すサンプルコードでは、指定したディレクトリ内に含まれるファイルもしくはディレクトリ移動した場合にイベントが発生します。

サンプルコードを以下に記します。

maskにpyinotify.IN_MOVED_TOを指定することで、ファイル/ディレクトリの移動を監視しています。
IN_MOVED_TOをIN_CREATEにすれば、ファイル/ディレクトリが生成されたタイミングでイベントが発生します。
ディレクトリを指定した場合には、対象ディレクトリ以下のサブディレクトリも監視対象となります。
ただし、監視中(プログラム起動後)に新たに設置されたフォルダー内部は監視対象にならないということに注意が必要です。
syslogにログを残す機能も併せて盛り込んでしまいました。

意外と簡単ですよね。