2017-10-09 48 views
0

我正在一個「樹視圖」病人列表,我們可以在其中搜索病人,並選擇一個。我想對所選擇的患者用鼠標右鍵單擊,並與有關病人信息翻開新的一頁:綁定鍵點擊選擇的項目從一棵樹與Python tkinter

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() 

我無法結合新窗口打開鼠標右鍵,我做一些編碼,但我不是100%理解它,因此它不工作...

任何關於這個問題的想法將是有益的和讚賞!

+1

嘗試做 「結合」 到'treeview'第一('self.tree.bind( 「」,self.click)')。現在,只有一個「綁定」到一個框架,所以目前還不清楚你期望的。 – CommonSense

回答

0

首先在樹上綁定右鍵,而不是在fram上,即用self.tree.bind("<Button-3>", self.click)替換self.frame.bind("<Button-3>", self.click)

然後,您需要知道用戶點擊了樹視圖中的哪個項目。爲此,您可以使用self.tree.identify_row(event.y),它返回位置爲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) 
+0

謝謝,我看到我錯誤地將框架綁定到框架上,並且在遵循您的建議時,設法解決了問題並使其工作正常!而且,現在我的綁定更清晰了! –