省型旧形国電の残影を求めて

戦前型旧形国電および鉄道と変褪色フィルム写真を中心とした写真補正編集の話題を扱います。他のサイトでは得られない、筆者独自開発の写真補正ツールや補正技法についても情報提供しています。写真補正技法への質問はコメント欄へどうぞ

ImageJ / Python プログラミング Tips: ValueError: invalid literal for float

 ImageJ のインターアクティブ UI を書いていて、次のようなエラーメッセージが出ました。

  ValueError: invalid literal for float

このエラーが出たのは以下のコードでした。

            self.maskThr = float(self.nfield_maskThr.getText())

UI の numericField から値を取得して、それを UI に反映させようとするコードです。この時、ImageJ の API 上では直接数値を取得できます。しかし、UI でインターアクティブに動かそうとすると、textListener 上でモニタしなければなりません。

 ということは、直接数値で取得することはできず、一旦テキストデータとして取得してから組み込み関数で数値に直して UI に反映させる必要があります。その際に何かの拍子に上のエラーが出るようでした。

 ただこのコードを以下のように変えるとエラーが出ません。

            tempText = self.nfield_maskThr.getText()

            self.maskThr = float(tempText)

  それに、エラーメッセージが出ても、とりあえずちゃんと動くようです。色々考えてみてわかったことは、データを入れ直そうとして、一時的に数字を全て消した時に、つまり、numericField に何も入っていない状態になった時にエラーメッセージが出るようです。何も入っていないので、float で数値に変換しようとしてもできない、ということのようです。

 但し、一旦変数に入れてから、float をかけると、その変数に何も入っていない時は、0 と解釈してくれるようでエラーメッセージが出ないようです。

 そこで、上のエラーを回避するために以下のように変更してみるとうまくエラーメッセージが出なくなりました。

        if self.nfield_maskThr.getText() !="":
            self.maskThr = float(str(self.nfield_maskThr.getText()))

つまり、numericField が空白でない時のみ、float で変換するようにしたわけです。