2017-09-12 52 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

以下の私の説明の抜粋を参照してください。名前のリストを、この、entryウィジェットが更新されるたびに、私たちの周期でそう

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ウィジェットの値はの値と一致するかどうかを確認elementnameslistentryウィジェットの値の長さ(EG、5文字の長さの文字列を入力すると、要素の最初の5文字を​​チェックします)。

これらが一致すると、ツリーエントリのidlistに追加されます。

すべての名前が確認された後、idの一致のlistself.tree.selection_set()に渡し、一致するすべてのツリーエントリを強調表示します。

+0

ありがとうございます!私はそれをテストし、私のフィードバックを提供します!私はまだ学習とテスト段階にあり、あなたのコメントはまさに私が今必要なものです。 –

0

何らかの検索が既にボックスから実装されているので、別の検索でも必要はありません。

患者に適切なタグを付けるだけでいいです。その後、これらのタグで検索することができます(特定の患者に複数のタグを提供できます)。患者の外観/ハイライト表示を制御します(ツリービューの行)。

さんが遊んでみましょう:ちょうど basic search ...患者をハイライト表示し、この今

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

...しかし、あなたは簡単に全体のツリービューをソートする.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

、そこに車輪の再発明には必要だんが、あなたのツリービューをすることによって変更可能である場合これらのタグは変更可能なコンテンツと同期させる必要があることに注意してください。

treeviewの詳細はhereです。

+0

非常に参考になりました、ありがとう!私は間違いなくあなたのソリューションをテストし、どのように動作するかを見て、いくつかのフィードバックを提供します! –

関連する問題