绑定功能到树视图不起作用Tkinter

时间:2018-05-06 11:56:10

标签: python tkinter

我制作了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

2 个答案:

答案 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中的命名约定说你应该只使用名称。它完全取决于您,但如果您希望其他人了解您的代码,则有助于符合标准。 :)