使用 python tkinter 将键单击绑定到树中的选定项目
bind key click to selected item from a tree with python tkinter
我正在处理 "treeview" 患者列表,我们可以在其中搜索患者和 select 患者。我想右键单击 selected 患者并打开一个包含患者信息的新页面:
try:
import tkinter
from tkinter import ttk
except ImportError:
import Tkinter as tkinter
import ttk
class Mainpage:
def __init__(self, master):
self.master = master
self.frame = tkinter.Frame(self.master)
self.master.columnconfigure(0, weight=1)
self.master.columnconfigure(1, weight=3)
self.master.columnconfigure(2, weight=1)
self.master.columnconfigure(3, weight=1)
self.master.columnconfigure(4, weight=1)
self.searchfield = tkinter.Frame(self.master)
self.searchfield.grid(row=1, column=0, columnspan=4)
self.search_var = tkinter.StringVar()
self.search_var.trace("w", lambda name, index, mode: self.selected)
self.entry = tkinter.Entry(self.searchfield, textvariable=self.search_var, width=45)
self.entry.grid(row=0, column=0, padx=10, pady=3)
self.searchbtn = tkinter.Button(self.searchfield, text='Search', command=self.selected)
self.searchbtn.grid(row=0, column=1)
self.treeFrame = tkinter.Listbox(self.searchfield, width=45, height=150)
self.treeFrame.grid(row=1, column=0, padx=10, pady=3)
self.tree = ttk.Treeview( self.treeFrame, columns=('Status', 'Name', 'Date'))
self.tree.heading('#0', text='Status')
self.tree.heading('#1', text='Name')
self.tree.heading('#2', text='Date')
self.tree.heading('#3', text='Transact Code')
self.tree.column('#0', stretch=tkinter.YES)
self.tree.column('#1', stretch=tkinter.YES)
self.tree.column('#2', stretch=tkinter.YES)
self.tree.column('#3', stretch=tkinter.YES)
self.tree.grid(row=0, columnspan=4, sticky='nsew')
self.treeview = self.tree
self.i = 1
self.patient_list = [{"Name":"Harry Thuku", "Date":"07.09.2017"},
{"Name":"stella stl", "Date": "07.09.2017"},
{"Name":"geg be", "Date": "07.09.2017"},
{"Name":"Henry Reeta", "Date": "06.09.2017"},
{"Name":"Henry Reeta", "Date": "06.09.2017"}]
for p in self.patient_list:
self.tree.insert('', 'end', text="ID_"+str(self.i), values=
(p["Name"], p["Date"]), tags=p["Name"])
self.i = self.i + 1
self.search_item = self.entry.get()
for p in self.patient_list:
if p["Name"] == self.search_item:
self.selected(self.search_item)
self.frame.bind("<Button-3>", self.click)
self.frame.grid_location(0, 0)
def selected(self):
search_for = self.search_var.get()
iid_to_select = ()
if search_for != '':
all_tags = self.master.tk.call(str(self.tree), "tag", "names")
tags_to_select = tuple(filter(lambda tag: search_for.lower() in tag.lower(), all_tags))
for sorted_tag in tags_to_select:
iid_to_select += self.tree.tag_has(sorted_tag)
self.tree.selection_set(iid_to_select)
def click(self, event):
print("Clicked at: ", event.x, event.y)
self.master.withdraw()
self.toplevel = tkinter.Toplevel(self.master)
self.toplevel.geometry("480x480")
app = PatientPage(self.toplevel)
class PatientPage:
#.....
pass
root = tkinter.Tk()
root.title("Login")
root.geometry("480x480")
Mainpage(root)
root.mainloop()
我无法将鼠标右键单击与新 window 的打开绑定,我做了一些编码,但不是 100% 理解它,因此它不起作用...
任何关于这个主题的想法都会有所帮助和感激!
首先,在树上绑定右键,而不是在框架上,即将self.frame.bind("<Button-3>", self.click)
替换为self.tree.bind("<Button-3>", self.click)
。
然后,您需要知道用户单击了树视图中的哪个项目。为此,您可以使用 self.tree.identify_row(event.y)
,其中 returns 位置 event.y
的项目 ID。
并且,如果需要,您可以使用 self.tree.item(<item>, 'values')
检索存储在树视图中的患者信息。
所以click
变成:
def click(self, event):
item = self.tree.identify_row(event.y)
if item: # right click on a patient
self.master.withdraw()
self.toplevel = tkinter.Toplevel(self.master)
self.toplevel.geometry("480x480")
info = self.tree.item(item, 'values')
print(info)
app = PatientPage(self.toplevel)
我正在处理 "treeview" 患者列表,我们可以在其中搜索患者和 select 患者。我想右键单击 selected 患者并打开一个包含患者信息的新页面:
try:
import tkinter
from tkinter import ttk
except ImportError:
import Tkinter as tkinter
import ttk
class Mainpage:
def __init__(self, master):
self.master = master
self.frame = tkinter.Frame(self.master)
self.master.columnconfigure(0, weight=1)
self.master.columnconfigure(1, weight=3)
self.master.columnconfigure(2, weight=1)
self.master.columnconfigure(3, weight=1)
self.master.columnconfigure(4, weight=1)
self.searchfield = tkinter.Frame(self.master)
self.searchfield.grid(row=1, column=0, columnspan=4)
self.search_var = tkinter.StringVar()
self.search_var.trace("w", lambda name, index, mode: self.selected)
self.entry = tkinter.Entry(self.searchfield, textvariable=self.search_var, width=45)
self.entry.grid(row=0, column=0, padx=10, pady=3)
self.searchbtn = tkinter.Button(self.searchfield, text='Search', command=self.selected)
self.searchbtn.grid(row=0, column=1)
self.treeFrame = tkinter.Listbox(self.searchfield, width=45, height=150)
self.treeFrame.grid(row=1, column=0, padx=10, pady=3)
self.tree = ttk.Treeview( self.treeFrame, columns=('Status', 'Name', 'Date'))
self.tree.heading('#0', text='Status')
self.tree.heading('#1', text='Name')
self.tree.heading('#2', text='Date')
self.tree.heading('#3', text='Transact Code')
self.tree.column('#0', stretch=tkinter.YES)
self.tree.column('#1', stretch=tkinter.YES)
self.tree.column('#2', stretch=tkinter.YES)
self.tree.column('#3', stretch=tkinter.YES)
self.tree.grid(row=0, columnspan=4, sticky='nsew')
self.treeview = self.tree
self.i = 1
self.patient_list = [{"Name":"Harry Thuku", "Date":"07.09.2017"},
{"Name":"stella stl", "Date": "07.09.2017"},
{"Name":"geg be", "Date": "07.09.2017"},
{"Name":"Henry Reeta", "Date": "06.09.2017"},
{"Name":"Henry Reeta", "Date": "06.09.2017"}]
for p in self.patient_list:
self.tree.insert('', 'end', text="ID_"+str(self.i), values=
(p["Name"], p["Date"]), tags=p["Name"])
self.i = self.i + 1
self.search_item = self.entry.get()
for p in self.patient_list:
if p["Name"] == self.search_item:
self.selected(self.search_item)
self.frame.bind("<Button-3>", self.click)
self.frame.grid_location(0, 0)
def selected(self):
search_for = self.search_var.get()
iid_to_select = ()
if search_for != '':
all_tags = self.master.tk.call(str(self.tree), "tag", "names")
tags_to_select = tuple(filter(lambda tag: search_for.lower() in tag.lower(), all_tags))
for sorted_tag in tags_to_select:
iid_to_select += self.tree.tag_has(sorted_tag)
self.tree.selection_set(iid_to_select)
def click(self, event):
print("Clicked at: ", event.x, event.y)
self.master.withdraw()
self.toplevel = tkinter.Toplevel(self.master)
self.toplevel.geometry("480x480")
app = PatientPage(self.toplevel)
class PatientPage:
#.....
pass
root = tkinter.Tk()
root.title("Login")
root.geometry("480x480")
Mainpage(root)
root.mainloop()
我无法将鼠标右键单击与新 window 的打开绑定,我做了一些编码,但不是 100% 理解它,因此它不起作用...
任何关于这个主题的想法都会有所帮助和感激!
首先,在树上绑定右键,而不是在框架上,即将self.frame.bind("<Button-3>", self.click)
替换为self.tree.bind("<Button-3>", self.click)
。
然后,您需要知道用户单击了树视图中的哪个项目。为此,您可以使用 self.tree.identify_row(event.y)
,其中 returns 位置 event.y
的项目 ID。
并且,如果需要,您可以使用 self.tree.item(<item>, 'values')
检索存储在树视图中的患者信息。
所以click
变成:
def click(self, event):
item = self.tree.identify_row(event.y)
if item: # right click on a patient
self.master.withdraw()
self.toplevel = tkinter.Toplevel(self.master)
self.toplevel.geometry("480x480")
info = self.tree.item(item, 'values')
print(info)
app = PatientPage(self.toplevel)