前提・実現したいこと
現在Excel情報を取得し、取得した情報をTkinter.Treeviewに反映するGUIを作成しております。
Excelファイル内は以下の画像の様な形式とデータになっており
GUIでは、一つのIDを指定しopenpyxlでデータを抽出し画像の様にTreeviewで表示しております。
今回目的の実装したい項目は
- Excel内の塗りつぶし情報のTreeviewへの反映
(Treeview内でもbgを同じ色で反映したいです)
- Treeviewへのイベントの設定
該当のソースコード
python
1 #-------Excel Window------- 2 def ExcelProcess(self): 3 # NewWindow create. 4 self.submaster = tk.Toplevel() 5 self.submaster.geometry('700x400') 6 self.submaster.grab_set() 7 self.submaster.attributes('-topmost', True) 8 9 ttk.Button(self.submaster, text='データ表示', command=self.ExcelDataGet).pack(pady=10) 10 11 # Treeview create. set data of index and anchor together for tree. 12 tvframe = ttk.Frame(self.submaster) 13 tvframe.pack() 14 self.tree = ttk.Treeview(tvframe) 15 self.tree['column'] = tuple([i for i in range(7)]) 16 tree_info = {'INDEX1': [70, tk.CENTER], 'INDEX2': [50, tk.CENTER], 'INDEX3': [70, tk.CENTER], 17 'INDEX4': [60, tk.E], 'INDEX5': [150, tk.W], 'INDEX6': [50, tk.W], 'INDEX7': [120, tk.W]} 18 for i, [header, [width, anchor]] in enumerate(tree_info.items()): 19 self.tree.column(i, width=width, anchor=anchor) 20 self.tree.heading(i, text=header) 21 self.tree["show"] = "headings" 22 self.tree.grid(row=0, column=0) 23 24 # Scrollbar create. 25 ysb = tk.Scrollbar(tvframe, orient=tk.VERTICAL, width=16, command=self.tree.yview) 26 self.tree.configure(yscrollcommand=ysb.set) 27 ysb.grid(row=0, column=1, sticky='nsew') 28 29 30 def ExcelDataGet(self): 31 # Ecelfile open. 32 wb = px.load_workbook(self.excel_path) 33 sheet = wb['Sheet1'] 34 35 target = 1000001 36 self.data = [] 37 # Data create. Read line, Datetime attribute are convert and replace if blank. 38 for row in sheet.iter_rows(): 39 if row[1].value == target: 40 tmp = [] 41 for cell in row: 42 celldata = cell.value 43 if type(celldata) == datetime: 44 celldata = cell.value.strftime('%Y/%m/%d') 45 elif celldata == None: 46 celldata = '' 47 48 tmp.append(celldata) 49 self.data.append(tmp) 50 51 # If data has target tree delete it. 52 if self.tree: 53 tree_data = self.tree.get_children() 54 for td in tree_data: 55 self.tree.delete(td) 56 # Set data for tree 57 for d in self.data: 58 self.tree.insert('', 'end', values=d)
試したこと
以下でExcelを読み込みながらセル内の塗りつぶしに関するプロパティの取得は出来ました。
if文などで塗りつぶされている色が赤だった場合~と条件の分岐をさせ、Treeview上に反映を
させる為のデータの成形を考えておりましたが、色を指定した分岐方法がわかりません。
python
1import openpyxl as px 2 3wb = px.load_workbook(file) 4sheet = wb['Sheet1'] 5 6for row in sheet.iter_rows(): 7 for cell in row: 8 print(cell.fill.fgColor) 9 print(type(cell.fill.fgColor)) 10 11>>> <openpyxl.styles.colors.Color object> 12>>> Parameters: 13>>> rgb='FFFF0000', indexed=None, auto=None, theme=None, tint=0.0, type='rgb' 14>>> <class 'openpyxl.styles.colors.Color'> 15. 16.
イベントの設定についてですが、初めにイベントの内容として
itemをダブルクリックで、現在塗りつぶしが無い場合は赤に、赤ならば黄色に
黄色ならば塗りつぶしを無しに~とTreeview上の表示を変更していくつもりです。
その場合にself.tree.bind('<Double-1>', self.function)
とすべきなのか
self.tree.bind('<<TreeviewSelect>>', self.function)
とすべきなのかがわからず
また、いずれの場合にはイベントの内容をどの様に組み立てれば良いのかがわからず今回質問を致しました。
補足情報(FW/ツールのバージョンなど)
python3.8
widnows10
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。