我制作了ttk treeview,您可以在其中手动添加值。
(我不会发布整个代码,因为它很大)。
我还做了一个函数,应该计算两列的乘法,并将结果放在第三列。我将两个事件绑定到它,使用ENTER键(<Return>
)进行验证,并在单击其他单元格(<FocusOut>
)时进行验证。
由于某种原因,该程序仅在您按ENTER键时才有效,并且它不适用于FocusOut
。它没有显示任何错误,它只是不起作用。你知道这个问题吗?
def TotalCost(event):
try:
SelectedRow = NewTree.selection()[0]
Quantity=round(float(NewTree.item(SelectedRow,"values")[3]),2)
UnitCost=round(float(NewTree.item(SelectedRow,"values")[4]),2)
TotalCost=float(round(Quantity*UnitCost,2))
NewTree.set(SelectedRow, '#6', TotalCost)
except IndexError:
sys.exit()
pass
except ValueError:
Error=messagebox.showinfo("Error!","Please enter values for Planned Costs or Real Costs.")
sys.exit() #za resavalje greske
pass
NewTree.bind('<Return>', TotalCost) # validate with Enter
NewTree.bind('<FocusOut>', TotalCost) # validate when you click on other cell
答案 0 :(得分:1)
这是一个代码示例,用于说明绑定函数和不带任何按钮的调用函数。我用过python 2.7
import Tkinter as tk
main=tk.Tk()
var=tk.StringVar()
def rockon(event):
try:
var.set(int(e1.get())+int(e2.get()))
except:
pass
e1=tk.Entry(main)
e1.place(x=10,y=10)
e1.insert(tk.END,0)
e1.bind('<FocusOut>',rockon) #either u press tab
e1.bind('<Leave>',rockon) #either u move out of the widget
e1.bind('<Return>',rockon) #or u press enter key, it goes into the function "rockon"
e2=tk.Entry(main)
e2.place(x=10,y=50)
e2.insert(tk.END,0)
e2.bind('<FocusOut>',rockon)
e2.bind('<Leave>',rockon)
e2.bind('<Return>',rockon)
label=tk.Label(main,textvariable=var) #we print the total of two entries in label without pressing any button
label.place(x=10,y=100)
main.mainloop()
答案 1 :(得分:0)
我想你可能想要<<TreeviewSelect>>
事件。无论您是否单击相同或其他项目,只要您在树视图中选择项目,就会生成它。
这是一个小程序,用于打印您执行操作时生成的事件。运行它,看看它是否可以使用。
from tkinter import *
from tkinter import ttk
root = Tk()
root.geometry('300x400')
NewTree = ttk.Treeview(root)
NewTree.grid()
NewTree.insert('', 'end', text='Widget One')
NewTree.insert('', 'end', text='Widget Two')
NewTree.insert('', 'end', text='Widget Three')
def callback(binding):
print('Callback from:', binding)
NewTree.bind('<Return>', lambda event: callback(binding='Return'))
NewTree.bind('<FocusOut>', lambda event: callback(binding='FocusOut'))
NewTree.bind('<<TreeviewSelect>>', lambda event: callback(binding='TreeviewSelect'))
NewTree.bind('<Leave>', lambda event: callback(binding='Leave'))
root.mainloop()
顺便说一下; Python中的命名约定说你应该只使用类名称。它完全取决于您,但如果您希望其他人了解您的代码,则有助于符合标准。 :)