質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1485閲覧

チェックボックスで選択しTreeviewに表示したい

SoAmi

総合スコア1

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/02/21 01:37

解決したいこと

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

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

自分で試したこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

最初の問題点は search() メソッドです。chk_bln の中身が辞書(dict)になっていますので、それをカラム名のリストに変換します。また、str.contains()pandas.Series 型のメソッドなので、複数列(データフレーム(pandas.DataFrame 型インスタンス))を対象とする場合には使用できません。

python

1 def search(self, event=None): 2 global chk_bln 3 self.kd = self.keyword.get().strip() 4 cols = [self.colname_list[i] for i, v in chk_bln.items() if v.get()] 5 # result = self.data_org[self.data_org[chk_bln].str.contains(self.kd, na=False)] 6 result = self.data_org[self.data_org[cols].applymap(lambda x: self.kd in x).any(axis=1)] 7 self.update_tree_by_search_result(result)

次は TreeView が pack されていない事です。

python

1 def create_tree(self,parent): 2 self.result_text = tk.StringVar() 3 : 4 5 self.lbl_result.pack() 6 self.tree.pack()

イメージ説明

投稿2022/02/21 03:53

melian

総合スコア19703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SoAmi

2022/02/21 08:08

ご教授いただきありがとうございます。 .str.containsが使用できないとはまったく知りませんでした。 もっと知見を深めようと思います。 早速ですが、教えていただいた修正をおこなったところ下記エラーが出てしまいました。  result = self.data_org[self.data_org[cols].applymap(lambda x: self.kd in x).any(axis=1)] TypeError: argument of type 'float' is not iterable またTreeviewの見出しはチェックボックスでチェックを付けた項目のみ表示にしたいです。
melian

2022/02/21 08:38

欠損値があることを見おとしていました。 result = self.data_org[self.data_org[cols].applymap(lambda x:pd.notnull(x) and self.kd in x).any(axis=1)] として下さい。
SoAmi

2022/02/21 09:07

ありがとうございます。 検索は無事に行えました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問