CSVのデータをTreeviewで表示し、
ヘッダ列をクリックしたら昇順、もう一度クリックしたら降順、もう一度クリックしたら昇順、・・・、としたいです。
(一応この段階ではもとの順番に戻さなくていいです。)
クリックしたヘッダが何列目かまでは取得できましたが、クリックした列の各行のデータの取得と各行の入れ替え方法がわかりません。
一応、コメントアウトしてあるやつを有効化したときと同じ動作を期待しているのですが、最初のforの前にあるやつがよくわかりませんでした。文法的な意味で です。
以下ソースコードです。すべて同じ階層に配置。
main.py
Python
1from tkinter import ttk 2from tkinter.font import Font 3import tkinter as tk 4 5import read 6 7 8def headerSelected(tree, reverse_flag): 9 """ Memo 10 winfo_pointerx() マウスカーソルのx座標 11 winfo_rootx() ディスプレイ上でのx座標 12 identify_column(x) x座標のセルの識別子(文字列 "#n"。 nは1以上の整数)を返す 13 """ 14 # クリックされたヘッダ列取得(http://notwodaily.hatenablog.com/entry/2018/06/15/003411) 15 x = tree.winfo_pointerx() - tree.winfo_rootx() 16 select_column_str = tree.identify_column(x) 17 select_column_int = int(select_column_str[1:]) - 1 18 print(select_column_int) # 1列目クリックで0, 2列目クリックで1、・・・、n列目クリックでn-1 19 20 # クリックした列の各行のデータ取得 21 print(tree.get_children()) # ('I001', 'I002', 'I003', 'I004', 'I005', 'I006') 22 23 24 """ ソート(https://stackoverrun.com/ja/q/396512) 25 26 l = [(tree.set(k, select_column_int), k) for k in tree.get_children("")] 27 l.sort(reverse=reverse_flag) 28 29 for index, (val, k) in enumerate(l): 30 tree.move(k, "", index) 31 32 tree.heading(select_column_int, command=lambda:headerSelected(tree, not reverse_flag)) 33 """ 34 35 36win = tk.Tk() 37 38win.rowconfigure(0, weight=1) 39win.columnconfigure(0, weight=1) 40 41s = ttk.Style() 42s.theme_use("clam") 43fontsize = 30 44myfont = Font(size=fontsize) 45s.configure("Treeview.Heading", font=("", fontsize)) 46s.configure("Treeview", font=("", fontsize), 47 rowheight=myfont.metrics()["linespace"]) 48s.configure("Vertical.TScrollbar", arrowsize=30) 49 50 51datas = read.read() 52 53columns = 0 54for data in datas: 55 if columns < len(data): 56 columns = len(data) 57 58tree = ttk.Treeview(win) 59tree.grid(row=0, column=0, sticky="nsew", padx=(5, 0), pady=(5, 5)) 60tree["columns"] = tuple(range(columns)) 61tree["show"] = "headings" 62for i in range(columns): 63 tree.heading(i, text="Data"+str(i+1), command=lambda:headerSelected(tree, False)) 64for data in datas: 65 tree.insert("", "end", value=(data)) 66 67ysb = ttk.Scrollbar(win, orient="vertical", command=tree.yview) 68tree.configure(yscrollcommand=ysb.set) 69ysb.grid(row=0, column=1, sticky="nsew", padx=(0, 5), pady=5) 70 71 72win.mainloop() 73
read.py
Python
1import csv 2import os 3import sys 4 5def read(): 6 data = [] 7 SRC = os.path.dirname(sys.argv[0]) + "/" + "table.csv" 8 with open(file=SRC, mode="r", encoding="utf-8") as rf: 9 f = csv.reader(rf, lineterminator="\r\n") 10 for i in f: 11 data.append(i) 12 return data 13
table.csv
csv
1Aa0,Bb1,,, 2Cc2,Dd3, 3,Ee4 4Ff5,,,Gg6 5Hh7,Ii8,Jj9,Ll10,Mm11 6,,Nn12,,Oo13
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 16:34
2020/09/27 21:03
2020/09/27 23:26