import tkinter as tk from tkinter import ttk classScrollableApp: def__init__(self, root): # メインフレーム self.root = root self.root.title("Scrollable Treeview Example") # Canvasを使って全体スクロールを実現 self.canvas = tk.Canvas(root) self.scrollbar = ttk.Scrollbar( root, orient="vertical", command=self.canvas.yview ) self.scrollable_frame = ttk.Frame(self.canvas) # フレームをキャンバスに配置 self.scrollable_frame.bind( "<Configure>", lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")), ) self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw") self.canvas.configure(yscrollcommand=self.scrollbar.set) self.canvas.pack(side="left", fill="both", expand=True) self.scrollbar.pack(side="right", fill="y") # Treeviewの作成 self.tree = ttk.Treeview( self.scrollable_frame, columns=("col1", "col2"), show="headings" ) self.tree.heading("col1", text="Column 1") self.tree.heading("col2", text="Column 2") # Treeviewのデータを追加for i inrange(100): self.tree.insert("", "end", values=(f"Item {i}", f"Value {i}")) # Treeview専用スクロールバー self.tree_scrollbar = ttk.Scrollbar( self.scrollable_frame, orient="vertical", command=self.tree.yview ) self.tree.configure(yscrollcommand=self.tree_scrollbar.set) # Treeviewとスクロールバーの配置 self.tree.pack(side="left", fill="both", expand=True) self.tree_scrollbar.pack(side="right", fill="y") # マウスホイールのイベントバインド self.tree.bind("<Enter>", lambda e: self.set_active_widget(self.tree)) self.canvas.bind("<Enter>", lambda e: self.set_active_widget(self.canvas)) self.active_widget = None# 現在のアクティブウィジェット# マウスホイールイベント root.bind_all("<MouseWheel>", self.on_mouse_wheel) defset_active_widget(self, widget): """現在アクティブなウィジェットを設定""" self.active_widget = widget defon_mouse_wheel(self, event): """マウスホイールの挙動を制御"""if self.active_widget == self.tree: # Treeviewがアクティブな場合 scroll_pos = self.tree.yview() if (event.delta > 0and scroll_pos[0] == 0.0) or ( event.delta < 0and scroll_pos[1] == 1.0 ): # Treeviewが最上部または最下部の場合、全体スクロール self.canvas.yview_scroll(-1 * (event.delta // 120), "units") else: # Treeview内部をスクロール self.tree.yview_scroll(-1 * (event.delta // 120), "units") else: # 全体をスクロール self.canvas.yview_scroll(-1 * (event.delta // 120), "units") # アプリケーションの起動if __name__ == "__main__": root = tk.Tk() app = ScrollableApp(root) root.mainloop()
↧
■ - polysan_開発メモ
↧