Quantcast
Channel: プログラミング
Viewing all articles
Browse latest Browse all 8251

■ - polysan_開発メモ

$
0
0
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()

Viewing all articles
Browse latest Browse all 8251

Trending Articles