halbana
@halbana

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

チェックボックスで選択し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()

読み込んでいるcsvの画像です。
image.png

自分で試したこと

ブレークポイントをつけて1関数ずつ試したところ、検索で動きが止まっているように思いました。
しかし改善点が見つかりません。
改善点などご指摘いただきますようお願いいたします。

0

No Answers yet.

Your answer might help someone💌