解決したいこと
csvの中身をキーワード検索し、知りたい項目のみ表示できるGUIを作成したいです。
Panedwindowにキーワードを入力するフレーム、ボタン、チェックボックスの配置はできたのですが、検索ボタンを押した後、動かずエラーも出ていません。
どのあたりが問題だったのかお知恵をお借りしたく投稿します。
作業環境はWindows10、VScodeです。
初心者・独学です。
該当するソースコード
python
1 2import pandas as pd 3import tkinter as tk 4import tkinter.ttk as ttk 5 6rt_width = 1000 7rt_hgt = 700 8chk_bln = {} 9 10class LuvLuva(tk.Frame): 11 def __init__(self, master=None, parent=None): 12 super().__init__(master) 13 self.master = master 14 self.master.title("検索テスト") 15 self.master.geometry(str(rt_width)+'x'+str(rt_hgt)) 16 self.pack() 17 self.set_data() 18 self.create_widgets() 19 20 def set_data(self): 21 self.data_org = pd.read_csv(r'C:***\サンプル_python\sample.csv', dtype=str, encoding="utf-8") 22 self.colname_list = list(self.data_org.columns.tolist()) 23 self.search_col = "No" 24 25 def create_widgets(self): 26 self.pw_main = ttk.PanedWindow(self.master, orient="vertical") 27 self.pw_main.pack(expand=True, fill=tk.BOTH, side=tk.LEFT) 28 self.pw_top = ttk.PanedWindow(self.pw_main, orient=tk.HORIZONTAL, height=25) 29 self.pw_main.add(self.pw_top) 30 self.pw_left = ttk.PanedWindow(self.pw_main, orient=tk.HORIZONTAL) 31 self.pw_main.add(self.pw_left) 32 self.pw_right = ttk.PanedWindow(self.pw_main, orient=tk.HORIZONTAL) 33 self.pw_main.add(self.pw_right) 34 self.pw_bottom = ttk.PanedWindow(self.pw_main, orient=tk.HORIZONTAL) 35 self.pw_main.add(self.pw_bottom) 36 self.input_frame(self.pw_top) 37 SearchButton = ttk.Button(self.pw_top, text='検索', command=self.search) 38 SearchButton.pack(expand=True) 39 self.makelist(self.pw_left) 40 self.create_tree(self.pw_right) 41 42 def search(self, event=None): 43 self.kd = self.keyword.get() 44 result = self.data_org[self.data_org[chk_bln].str.contains(self.kd, na=False)] 45 self.update_tree_by_search_result(result) 46 47 def update_tree_by_search_result(self, result): 48 self.tree.delete(*self.tree.get_children()) 49 self.result_text.set(f"検索結果:{len(result)}") 50 for _, row in result.iterrows(): 51 #ツリーにアイテムを追加する 52 self.tree.insert("", tk.END, values=row[self.colname_list].to_list()) 53 54 def input_frame(self, parent): 55 fm_input = tk.Frame(parent,) 56 parent.add(fm_input) 57 lbl_keyword = ttk.Label(fm_input, text='キーワード', width=10, background='white') 58 lbl_keyword.grid(row=1, column=1, sticky=tk.E) 59 self.keyword = tk.StringVar() 60 ent_keyword = ttk.Entry(fm_input, justify='left', textvariable=self.keyword, width=50) 61 ent_keyword.grid(row=1, column=3) 62 63 def makelist(self,parent): 64 65 self.idx = len(self.colname_list) 66 67 cv_width = rt_width-500 68 cv_hgt = rt_hgt-100 69 70 71 canvas = tk.Canvas(parent, width=cv_width, height=cv_hgt, bg='white') 72 canvas.grid(row=1, rowspan=self.idx, column=0, columnspan=3) 73 74 vbar = ttk.Scrollbar(parent, orient=tk.VERTICAL, command=canvas.yview) 75 vbar.grid(row=1, rowspan=self.idx, column=3, sticky=tk.N+tk.S) 76 77 canvas.config(scrollregion=canvas.bbox("all"), yscrollcommand=vbar.set) 78 79 sc_hgt=int(150/6*(self.idx+1)) #8.92 80 canvas.config(scrollregion=(0, 0, rt_width, sc_hgt)) 81 frame = tk.Frame(canvas, bg='white') 82 canvas.create_window((0, 0), window=frame, anchor=tk.NW, width=canvas.cget('width')) 83 84 irow = 2 85 irow0 = 2 86 erow = self.idx+irow0 87 88 89 for i in range(0, len(self.colname_list)): 90 chk_bln[i] = tk.BooleanVar() 91 chk = tk.Checkbutton(frame, variable=chk_bln[i], text=self.colname_list[i], bg='white') 92 chk.pack(anchor=tk.W) 93 94 allSelectButton = ttk.Button(self.pw_bottom, text='全て選択', command=self.allSelect_click) 95 allSelectButton.pack(side=tk.LEFT, expand=True) 96 allClearButton = ttk.Button(self.pw_bottom, text='選択解除', command=self.allClear_click) 97 allClearButton.pack(side=tk.LEFT, expand=True) 98 99 def btn_click(bln): 100 for i in range(len(chk_bln)): 101 chk_bln[i].set(bln) 102 103 def allSelect_click(bln): 104 for i in range(len(chk_bln)): 105 chk_bln[i].set(True) 106 107 def allClear_click(bln): 108 for i in range(len(chk_bln)): 109 chk_bln[i].set(False) 110 111 def create_tree(self,parent): 112 self.result_text = tk.StringVar() 113 self.lbl_result = ttk.Label(parent, textvariable=self.result_text) 114 self.tree = ttk.Treeview(parent) 115 self.tree["column"] = self.colname_list # 116 self.tree["show"] = "headings" 117 for i, chk_bln in enumerate(zip(self.colname_list)): 118 self.tree.heading(i, text=chk_bln) 119 self.tree.column(i, width=200) 120 121 122 123def main(): 124 root = tk.Tk() 125 app = LuvLuva(master=root) 126 app.mainloop() 127 128if __name__ == "__main__": 129 main()
自分で試したこと
ブレークポイントをつけて1関数ずつ試したところ、検索で動きが止まっているように思いました。
しかし改善点が見つかりません。
改善点などご指摘いただきますようお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/21 08:08
2022/02/21 08:38
2022/02/21 09:07