Python 将函数绑定到treeview无法正常工作

Python 将函数绑定到treeview无法正常工作,python,tkinter,Python,Tkinter,我制作了ttk treeview,您可以在其中手动添加值。 我不会发布整个代码,因为它太大了。 我还做了一个函数,应该计算两列的乘法,并将结果放在第三列。我将两个事件绑定到它,使用ENTER键进行验证,并在单击其他单元格时进行验证。 出于某种原因,该程序只在按ENTER键时工作,而不使用FocusOut。它没有显示任何错误,只是不起作用。你知道有什么问题吗 def TotalCost(event): try: SelectedRow = NewTree.selectio

我制作了ttk treeview,您可以在其中手动添加值。 我不会发布整个代码,因为它太大了。 我还做了一个函数,应该计算两列的乘法,并将结果放在第三列。我将两个事件绑定到它,使用ENTER键进行验证,并在单击其他单元格时进行验证。 出于某种原因,该程序只在按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

下面是一个代码示例,用于说明绑定函数和不使用任何按钮调用函数。我已经使用了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()

我想你可能想参加这个活动。每当您在树状视图中选择一个项目时,无论您单击同一个项目还是其他项目,都会生成它

这里有一个小程序,它可以打印出你做事时生成的事件。运行它,看看这是否有用

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中的命名约定说您应该只将类名大写。这完全取决于您,但如果您希望其他人理解您的代码,则遵守标准会有所帮助

谢谢,但是我用装订法做到了这一点,但是非常感谢!