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

由于您的代码实际上并没有运行,我无法告诉您它的所有问题......但我可以很容易地发现两个。

首先,在 中multiply,您正在做product.config. 那不是你的价值DoubleVar。你几乎肯定想要product.set这里。

其次,你试图用<KeyRelease>. 例如,如果您使用鼠标从剪贴板粘贴,或使用下拉菜单更改值,则不会更新任何内容,因为没有按键释放事件。

<KeyPress>由于某种原因,您也具有约束力。在正常使用中,这意味着每次按键都Product用旧值更新,然后立即用新值再次更新。如果有人一直按住一个键直到它重复,你会不断更新,但总是落后一个重复。

如果您想尝试以这种方式做事,我相信您至少需要绑定这些事件:

  • <KeyRelease>(而不是<KeyPress>
  • <<ComboboxSelected>>
  • <<Clear>>
  • <<Cut>>
  • <<Paste>>

那么,还有什么其他方法可以做到呢?好吧,有一些,我真的不确定哪个是最 Pythonic(或 Tk-ish?);Tk 是 TOOWTDI 不支持的少数 Python 领域之一。但我想我会通过挂钩 each 的更新来做到这一点StringVar,而不是 each Combobox。只需扔掉bind电话,而是这样做:

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