2

tkinter トレース メソッドのコールバック関数に問題があります。2 つのエントリが必要で、各エントリの値は別のエントリの値に依存します。したがって、一方の値を変更すると、もう一方の値が変更されます。これは、これを行う簡単なコードです。

from tkinter import *

class main():

    def __init__(self, master):

        self.a = DoubleVar(value=2.0)
        self.b = DoubleVar()
        self.b.trace("w",self.calc_c)
        self.c = DoubleVar()
        self.c.trace("w",self.calc_b)

        Entry(master,textvariable=self.b).grid(row=0,column=0)
        Entry(master,textvariable=self.c).grid(row=0,column=1)

    def calc_b(self,name,index,mode):
        self.b.set(self.c.get()/self.a.get())

    def calc_c(self,name,index,mode):
        self.c.set(self.b.get()*self.a.get())


root = Tk()

prog = main(root)

root.mainloop()

プログラムは実際に動作し、正しい値を返しますが、エラーも発生します:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib64/python3.3/tkinter/__init__.py", line 1475, in __call__
    return self.func(*args)
  File "/home/anze/foo.py", line 22, in calc_c
    self.c.set(self.b.get()*self.a.get())
  File "/usr/lib64/python3.3/tkinter/__init__.py", line 332, in get
    return getdouble(self._tk.globalgetvar(self._name))
ValueError: could not convert string to float: 

誰かがこのエラーの意味を説明できますか?

ありがとうございました!

4

3 に答える 3

0

問題は、ウィジェットが入力として文字列を受け取る Entry であり、値が DoubleVar であることだと思いますが、ユーザーが無効な値を入力するのを防ぐための検証が行われていません。

入力値が float である限り、コードは機能します。無効な値が入力された後に呼び出すget()と、tkinter は Entry 内の文字列を float に変換しようとしますが、失敗して ValueError 例外をスローします。calc_ccalc_b

try-except ブロックで例外をキャッチできます。tryブロックには、例外を発生させる可能性のあるコードを配置します。exceptブロックは、例外がキャッチされたときに何が起こるかを定義します。else例外がキャッチされない場合に何が起こるかを定義するブロックを持つこともできます。

前の値を復元する calc_c の簡単な例 (else ブロックなし) を次に示します (calc_b も同様の方法で変更する必要があります)。

def calc_c(self,name,index,mode):
    try:
        self.c.set(self.b.get()*self.a.get())
    except ValueError:
        # here you can either complain to the user (message-box...) 
        # or just restore the last value using the other entry like so:
        self.b.set(self.c.get()/self.a.get())
于 2013-10-27T17:20:35.983 に答える