第7章:操作性を高める(フォント・ショートカット・横移動)

python

目的

  • フォントサイズ変更(メニュー・ショートカット)
  • 左右キーで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 から sidebarforget/add する実装がシンプル

前へ → 第6章
次へ → 第8章:仕上げと完成版

タイトルとURLをコピーしました