チェックボックスで選択しTreeviewに表示したい
解決したいこと
csvの中身をキーワード検索し、知りたい項目のみ表示できるGUIを作成したいです。
Panedwindowにキーワードを入力するフレーム、ボタン、チェックボックスの配置はできたのですが、検索ボタンを押した後、動かずエラーも出ていません。
どのあたりが問題だったのかお知恵をお借りしたく投稿します。
作業環境はWindows10、VScodeです。
初心者・独学です。
該当するソースコード
import pandas as pd
import tkinter as tk
import tkinter.ttk as ttk
rt_width = 1000
rt_hgt = 700
chk_bln = {}
class LuvLuva(tk.Frame):
def __init__(self, master=None, parent=None):
super().__init__(master)
self.master = master
self.master.title("検索テスト")
self.master.geometry(str(rt_width)+'x'+str(rt_hgt))
self.pack()
self.set_data()
self.create_widgets()
def set_data(self):
self.data_org = pd.read_csv(r'C:***\サンプル_python\sample.csv', dtype=str, encoding="utf-8")
self.colname_list = list(self.data_org.columns.tolist())
self.search_col = "No"
def create_widgets(self):
self.pw_main = ttk.PanedWindow(self.master, orient="vertical")
self.pw_main.pack(expand=True, fill=tk.BOTH, side=tk.LEFT)
self.pw_top = ttk.PanedWindow(self.pw_main, orient=tk.HORIZONTAL, height=25)
self.pw_main.add(self.pw_top)
self.pw_left = ttk.PanedWindow(self.pw_main, orient=tk.HORIZONTAL)
self.pw_main.add(self.pw_left)
self.pw_right = ttk.PanedWindow(self.pw_main, orient=tk.HORIZONTAL)
self.pw_main.add(self.pw_right)
self.pw_bottom = ttk.PanedWindow(self.pw_main, orient=tk.HORIZONTAL)
self.pw_main.add(self.pw_bottom)
self.input_frame(self.pw_top)
SearchButton = ttk.Button(self.pw_top, text='検索', command=self.search)
SearchButton.pack(expand=True)
self.makelist(self.pw_left)
self.create_tree(self.pw_right)
def search(self, event=None):
self.kd = self.keyword.get()
result = self.data_org[self.data_org[chk_bln].str.contains(self.kd, na=False)]
self.update_tree_by_search_result(result)
def update_tree_by_search_result(self, result):
self.tree.delete(*self.tree.get_children())
self.result_text.set(f"検索結果:{len(result)}")
for _, row in result.iterrows():
#ツリーにアイテムを追加する
self.tree.insert("", tk.END, values=row[self.colname_list].to_list())
def input_frame(self, parent):
fm_input = tk.Frame(parent,)
parent.add(fm_input)
lbl_keyword = ttk.Label(fm_input, text='キーワード', width=10, background='white')
lbl_keyword.grid(row=1, column=1, sticky=tk.E)
self.keyword = tk.StringVar()
ent_keyword = ttk.Entry(fm_input, justify='left', textvariable=self.keyword, width=50)
ent_keyword.grid(row=1, column=3)
def makelist(self,parent):
self.idx = len(self.colname_list)
cv_width = rt_width-500
cv_hgt = rt_hgt-100
canvas = tk.Canvas(parent, width=cv_width, height=cv_hgt, bg='white')
canvas.grid(row=1, rowspan=self.idx, column=0, columnspan=3)
vbar = ttk.Scrollbar(parent, orient=tk.VERTICAL, command=canvas.yview)
vbar.grid(row=1, rowspan=self.idx, column=3, sticky=tk.N+tk.S)
canvas.config(scrollregion=canvas.bbox("all"), yscrollcommand=vbar.set)
sc_hgt=int(150/6*(self.idx+1)) #8.92
canvas.config(scrollregion=(0, 0, rt_width, sc_hgt))
frame = tk.Frame(canvas, bg='white')
canvas.create_window((0, 0), window=frame, anchor=tk.NW, width=canvas.cget('width'))
irow = 2
irow0 = 2
erow = self.idx+irow0
for i in range(0, len(self.colname_list)):
chk_bln[i] = tk.BooleanVar()
chk = tk.Checkbutton(frame, variable=chk_bln[i], text=self.colname_list[i], bg='white')
chk.pack(anchor=tk.W)
allSelectButton = ttk.Button(self.pw_bottom, text='全て選択', command=self.allSelect_click)
allSelectButton.pack(side=tk.LEFT, expand=True)
allClearButton = ttk.Button(self.pw_bottom, text='選択解除', command=self.allClear_click)
allClearButton.pack(side=tk.LEFT, expand=True)
def btn_click(bln):
for i in range(len(chk_bln)):
chk_bln[i].set(bln)
def allSelect_click(bln):
for i in range(len(chk_bln)):
chk_bln[i].set(True)
def allClear_click(bln):
for i in range(len(chk_bln)):
chk_bln[i].set(False)
def create_tree(self,parent):
self.result_text = tk.StringVar()
self.lbl_result = ttk.Label(parent, textvariable=self.result_text)
self.tree = ttk.Treeview(parent)
self.tree["column"] = self.colname_list #
self.tree["show"] = "headings"
for i, chk_bln in enumerate(zip(self.colname_list)):
self.tree.heading(i, text=chk_bln)
self.tree.column(i, width=200)
def main():
root = tk.Tk()
app = LuvLuva(master=root)
app.mainloop()
if __name__ == "__main__":
main()
自分で試したこと
ブレークポイントをつけて1関数ずつ試したところ、検索で動きが止まっているように思いました。
しかし改善点が見つかりません。
改善点などご指摘いただきますようお願いいたします。
0