目的
- フォントサイズ変更(メニュー・ショートカット)
- 左右キーで1列単位の表示位置移動(行番号は固定)
- 右サイドバー(列表示パネル)の表示/非表示切替
フォントサイズの適用
def _apply_font_size(self, size: int):
size = max(8, min(28, int(size)))
if size == self.font_size: return
self.font_size = size
self.table_font.configure(size=self.font_size)
self.heading_font.configure(size=max(self.font_size, 11))
self.style.configure("Treeview", rowheight=int(self.font_size * 1.6))
1列単位の横移動(Left/Right)
def _right_display_columns(self):
cols = self.tree_right["displaycolumns"]
return list(cols) if isinstance(cols, (list, tuple)) else list(self.tree_right["columns"])
def _right_column_widths(self):
cols = self._right_display_columns()
return [self.tree_right.column(c, "width") for c in cols]
def _right_left_offset_px(self):
left_frac = self.tree_right.xview()[0]
return left_frac * max(1, sum(self._right_column_widths()))
def _right_find_leftmost_display_index(self, offset_px):
acc = 0
for i, w in enumerate(self._right_column_widths()):
if acc + w > offset_px + 1:
return i
acc += w
return 0
def _scroll_columns(self, step: int):
widths = self._right_column_widths()
cur_px = self._right_left_offset_px()
cur_idx = self._right_find_leftmost_display_index(cur_px)
target_idx = min(len(widths) - 1, max(0, cur_idx + step))
target_px = sum(widths[:target_idx])
total = max(1, sum(widths))
self.tree_right.xview_moveto(target_px / total)
# キーバインド例
self.bind_all("<Left>", lambda e: self._scroll_columns(-1))
self.bind_all("<Right>", lambda e: self._scroll_columns(1))
self.bind_all("<Control-Left>", lambda e: self.tree_right.xview_scroll(-1, "pages"))
self.bind_all("<Control-Right>", lambda e: self.tree_right.xview_scroll( 1, "pages"))
右サイドバーの表示切替
ttk.Panedwindow
からsidebar
をforget/add
する実装がシンプル
前へ → 第6章
次へ → 第8章:仕上げと完成版