2017-09-12 1 views
0

환자의 이름과 방문 날짜가있는 환자의 목록에 대한 간단한 GUI를 만들고 있습니다. tkinter 및 treeview를 사용하여 사용자가 입력해야하는 항목이 있습니다. 환자의 이름과 생각은 환자의 이름이 목록에 있으면 환자의 이름이 강조 표시된 (또는 선택된) 행 (또는 행)입니다. 또는 다른 옵션을 모든 환자의 목록 상자에 포함하여 검색 할 환자 이름이있는 항목 만 표시 할 수 있습니다.treeview에서 검색하고 검색된 항목이 포함 된 행을 강조 표시/선택

내가 전에 트 리뷰를 사용하지 않은 그 기능과 예에 대한 많은 데이터를 찾을 수 없습니다, 그래서, 어떤 아이디어가이 시점에서 도움이 될 것입니다 선택/하이라이트 부분을 고민하고

....

내 코드는 다음과 같습니다.

import tkinter 
from 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=45) 
     self.treeFrame.grid(row=1, column=0, padx=10, pady=3) 


     self.tree = ttk.Treeview(self.treeFrame, columns=('Name', 'Date')) 
     self.tree.heading('#0', text='ID') 
     self.tree.heading('#1', text='Name') 
     self.tree.heading('#2', text='Date') 
     self.tree.column('#1', stretch=tkinter.YES) 
     self.tree.column('#2', stretch=tkinter.YES) 
     self.tree.column('#0', stretch=tkinter.YES) 
     self.tree.grid(row=4, columnspan=4, sticky='nsew') 
     self.treeview = self.tree 

     self.i = 1 
     self.patient_list = [{"Name": "Jane", "Date": "05.09.2017"}, 
          {"Name": "David", "Date": "04.09.2017"}, 
          {"Name": "Patrick", "Date": "03.09.2017"}] 
     for p in self.patient_list: 
      self.tree.insert('', 'end', text="ID_"+str(self.i), values= 
          (p["Name"], p["Date"])) 
      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) 


    def selected(self): 
     currentItem = self.tree.focus() 
     print(self.tree.item(currentItem)['values']) 


root=tkinter.Tk() 
d=MainPage(root) 
root.mainloop() 

미리 감사드립니다.

답변

0

아래에있는 내 설명 조각 참조하십시오이 너무

from tkinter import * 
from tkinter import ttk 

class App: 
    def __init__(self, root): 
     self.root = root 
     self.tree = ttk.Treeview(self.root) #create tree 
     self.sv = StringVar() #create stringvar for entry widget 
     self.sv.trace("w", self.command) #callback if stringvar is updated 
     self.entry = Entry(self.root, textvariable=self.sv) #create entry 
     self.names = ["Jane", "Janet", "James", "Jamie"] #these are just test inputs for the tree 
     self.ids = [] #creates a list to store the ids of each entry in the tree 
     for i in range(len(self.names)): 
      #creates an entry in the tree for each element of the list 
      #then stores the id of the tree in the self.ids list 
      self.ids.append(self.tree.insert("", "end", text=self.names[i])) 
     self.tree.pack() 
     self.entry.pack() 
    def command(self, *args): 
     self.selections = [] #list of ids of matching tree entries 
     for i in range(len(self.names)): 
      #the below if check checks if the value of the entry matches the first characters of each element 
      #in the names list up to the length of the value of the entry widget 
      if self.entry.get() != "" and self.entry.get() == self.names[i][:len(self.entry.get())]: 
       self.selections.append(self.ids[i]) #if it matches it appends the id to the selections list 
     self.tree.selection_set(self.selections) #we then select every id in the list 

root = Tk() 
App(root) 
root.mainloop() 

를 모든 시간은 entry 위젯 이름의 목록을 통해, 우리가주기를 업데이트하고 entry 위젯의 값이의 값과 일치하는지 확인한다 elementnameslistentry 위젯의 값 (EG, 5 문자의 긴 문자열을 입력하면 요소의 처음 5 문자를 확인)까지입니다.

일치하는 경우 트리 항목의 idlist에 추가합니다.

모든 이름을 확인한 후 id과 일치하는 listself.tree.selection_set()에 전달하고 일치하는 모든 트리 항목을 강조 표시합니다.

+0

고맙습니다.나는 그것을 시험하고 나의 피드백을 제공 할 것이다! 나는 아직 학습 및 테스트 단계에 있으며 귀하의 의견은 바로 지금 필요한 것입니다. –

0

검색 기능 중 일부는 이미 상자에서 바로 구현되었으므로 다른 유형은 필요 없습니다.

환자에게 적절한 태그를 제공하기 만하면됩니다. 그런 다음이 태그로 검색 할 수 있습니다 (예, 특정 환자에게 여러 개의 태그를 제공 할 수 있음). 환자의 모양/강조 표시 (트리보기 행)를 제어 할 수 있습니다. ...

class MainPage: 
    def __init__(self,master): 
     # ... 
     for p in self.patient_list: 
      # Note tags argument, right now we use names of patients 
      self.tree.insert('', 'end', text="ID_" + str(self.i), values= 
          (p["Name"], p["Date"]), tags=p["Name"]) 
     # ... 

    # ... 
    def selected(self): 
     # setting selection by iids with tag (name of a patient or whatever) 
     self.tree.selection_set(self.tree.tag_has(self.search_var.get())) 
    # ... 

는 지금이 바로 환자를 강조 basic search 을 ...하지만 당신은 쉽게 전체 트리 뷰를 정렬하는 .detach().move()의 쌍이를 수정할 수 있습니다

는의 주위 놀자.

또한, 당신은 몇 줄의 코드와 부분 검색을 구현할 수 있습니다 결론적으로

class MainPage: 
    # ... 
    def selected(self): 
     search_for = self.search_var.get() 
     iid_to_select =() 

     # if there's any sense in search 
     if search_for != '': 
      # get all tags from tkinter 
      all_tags = self.master.tk.call(str(self.tree), "tag", "names") 

      # sort tags by search query 
      tags_to_select = tuple(filter(lambda tag: search_for.lower() in tag.lower(), all_tags)) 

      # gather iids by tags to select 
      for sorted_tag in tags_to_select: 
       iid_to_select += self.tree.tag_has(sorted_tag) 

     # setting selection by iids 
     self.tree.selection_set(iid_to_select) 
    # ... 

partial search

,이 바퀴를 개혁의 필요가 없습니다, 그러나 당신의 트 리뷰에 의해 변경 가능한 경우 사용자 - 이러한 태그는 변경 가능한 콘텐츠와 동기화되어야합니다.

트리 뷰에 대한 자세한 내용은 here을 참조하십시오.

+0

매우 도움이됩니다. 감사합니다. 확실히 솔루션을 테스트하고 작동 방식을 확인하고 피드백을 제공합니다! –

관련 문제