Функция привязки к дереву не работает Tkinter - PullRequest
0 голосов
/ 06 мая 2018

Я сделал ttk treeview, в котором вы можете вручную добавлять значения. (Я не собираюсь публиковать весь код, потому что это большой). Я также сделал функцию, которая должна вычислять умножение двух столбцов и поместить результат в третий столбец. Я связываю с ним два события, проверяю с помощью клавиши ENTER (<Return>) и проверяю, когда вы нажимаете на другую ячейку (<FocusOut>). По какой-то причине программа работает только при нажатии клавиши ВВОД и не работает с 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 голосов
/ 09 мая 2018

Думаю, вам может понадобиться событие <<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 гласят, что вы должны использовать только заглавные буквы class . Это зависит только от вас, но если вы хотите, чтобы другие люди понимали ваш код, это помогает соответствовать стандартам. :)

0 голосов
/ 08 мая 2018

Вот пример кода для иллюстрации функций привязки и вызова функции без какой-либо кнопки. я использовал 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...