2

Python の初心者の問題でまたお邪魔してすみません。コンボボックスを使用して Python で簡単な計算 (乗算) を実行しようとしていますが、方法がわかりません。以下に、私がこれまでに成功しなかったことを示します。あなたが私を助けてくれることを願っています!

事前にどうもありがとうございました

これが私のコードです:

import Tkinter

root = Tk()
root.title("Model A")
root.minsize(400, 220)
root.maxsize(410, 240)

# start of Notebook (multiple tabs)
notebook = ttk.Notebook(root)
notebook.pack(fill='both', expand='yes')
notebook.pressed_index = None

# child frames
frameOne = Tkinter.Frame(notebook, bg='white',width=560, height=100)

frameOne.pack(fill='both', expand=True)
# pages
notebook.add(frameOne, text='Simple calculation')

#Close Application Button
def quit(root):
    root.destroy()
tk.Button(root, text="Close Application", command=lambda root=root:quit(root)).pack()

## Calculation
def defocus(event):
    event.widget.master.focus_set()
def multiply(*args):
    try:
        product.config(round(float(Num_One.get())*float(Num_Two.get())))
    except ValueError:
        pass

## variables
Num_One = StringVar()
Num_Two = StringVar()
product = DoubleVar()
#Number One
ttk.Label(frameOne, text="Select First Number:").grid(column =3, row = 0)
NumOne_Select = Combobox(frameOne, values=("1", "2", "3","4", "5"),textvariable=Num_One)
NumOne_Select.grid(column=4, row=0, columnspan="5", sticky="nswe")
NumOne_Select.bind('<KeyPress>', multiply)
NumOne_Select.bind('<KeyRelease>', multiply)

#Number two
ttk.Label(frameOne, text="Select Second Number:").grid(column =3, row = 6 )
NumTwo_Select = Combobox(frameOne, values=("1", "2", "3","4", "5"),textvariable=Num_Two)
NumTwo_Select.grid(column=4, row=6, columnspan="5", sticky="nswe")
NumTwo_Select.bind('<KeyPress>', multiply)
NumTwo_Select.bind('<KeyRelease>', multiply)

# display results
ttk.Label(frameOne, text = "Product:").grid(column = 3, row = 8)
ttk.Label(frameOne, textvariable=product).grid(column = 4, row = 8)

root.mainloop()
4

1 に答える 1

1

あなたのコードは実際には実行されないので、すべての問題を説明することはできませんが、2 つの問題は簡単に見つけることができます。

まず、 ではmultiply、 を実行していproduct.configます。それはあなたが a の値をどうするかではありませんDoubleVar。あなたはほぼ確実product.setにここを望んでいます。

次に、すべての変更を でキャッチしようとしています<KeyRelease>。たとえば、クリップボードからマウスで貼り付けたり、プルダウン メニューを使用して値を変更したりしても、キー リリース イベントがないため、何も更新されません。

あなたも<KeyPress>何らかの理由で拘束力があります。通常の使用では、これは、キーを押すたびProductに古い値で更新し、すぐに新しい値で再度更新することを意味します。誰かがキーが繰り返されるまで押し続けている場合、あなたは更新を続けますが、常に 1 つ遅れて繰り返されます。

この方法を試したい場合は、少なくとも次のイベントをバインドする必要があると思います。

  • <KeyRelease>(ではない<KeyPress>
  • <<ComboboxSelected>>
  • <<Clear>>
  • <<Cut>>
  • <<Paste>>

では、それを行うには他にどのような方法がありますか?ええと、いくつかありますが、どれが最もpythonic(またはTkっぽい?)であるかは本当にわかりません。Tk は、TOOWTDI が適用されない Python の数少ない領域の 1 つです。StringVarしかし、 eachの代わりに eachの更新をフックすることでそれを行うと思いますCombobox。呼び出しを破棄してbind、代わりに次のようにします。

Num_One.trace("w", multiply)
Num_Two.trace("w", multiply)
于 2013-04-04T18:20:47.503 に答える