0
0

python GUI tcl/tk ウィンドウ全体のスクロールバー、スクロールバー操作時に処理実行

Last updated at Posted at 2024-05-02

実行サンプル

・python GUI tcl/tk ウィンドウ全体のスクロールバーを実装
・垂直スクロールバー操作時に処理実行
 下図のように、垂直方向のスクロールバーをユーザー操作で動かすと、
 プログラム起動したコマンドプロンプトにメッセージが表示される。

image.png

実行環境

windows10
python3.9.5

pythonモジュール tcl/tk

実行手順

ソースコードを作成する
windowsコマンドプロンプトでプログラム作成したフォルダに移動し、下記実行する

python プログラム名.py 

参考 URL

https://qiita.com/thruaxle/items/0fc3e89bd15e3d2f79a1
https://daeudaeu.com/scrollbar/#google_vignette

ソースコード

#
# ウィンドウ全体にフレーム配置する
#   垂直方向のスクロールバーがユーザー操作で動かされた時に処理実行する(printでメッセージ表示)

import os

import tkinter as tk
from tkinter import ttk
import tkinter.messagebox

class MainWindow(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)

        self.master.title("sample wintop scrollbar")
        #self.master.geometry("2000x1500")  # (1300x600)  必ず、全部の部品が見えるサイズ以上にする. スクロールバーもこの範囲までが有効になる
        self.g_winsizeW = 1000
        self.g_winsizeH = 2000
        str_sizeWH = str(self.g_winsizeW) + "x" + str(self.g_winsizeH)
        self.master.geometry(str_sizeWH)

        # -start- 全体スクロールバー設定
        self.canvas_wintop = tk.Canvas(self.master)
        self.frame_wintop = tk.Frame(self.canvas_wintop)
        self.scrollbarV = tk.Scrollbar(
            self.canvas_wintop, orient=tk.VERTICAL, command=self.canvas_wintop.yview
        )
        # スクロールの設定
        self.canvas_wintop.configure(scrollregion=(0, 0, self.g_winsizeW, self.g_winsizeH))
        #self.canvas_wintop.configure(yscrollcommand=self.scrollbarV.set)
        self.canvas_wintop.configure(yscrollcommand=self.func_on_vertical_scroll)
        #
        # 水平方向スクロールバー
        self.scrollbarH = tk.Scrollbar(
            self.canvas_wintop, orient=tk.HORIZONTAL, command=self.canvas_wintop.xview
        )
        self.canvas_wintop.configure(xscrollcommand=self.scrollbarH.set)

        # 諸々を配置
        self.scrollbarV.pack(side=tk.RIGHT, fill=tk.Y)
        self.scrollbarH.pack(side=tk.BOTTOM, fill=tk.X)  # 水平方向スクロールバー
        self.canvas_wintop.pack(expand=True, fill=tk.BOTH)

        # Canvas上の座標(0, 0)に対してFrameの左上(nw=north-west)をあてがうように、Frameを埋め込む
        self.canvas_wintop.create_window((0, 0), window=self.frame_wintop, anchor="nw", width=self.g_winsizeW, height=self.g_winsizeH)
        # -end- 全体スクロールバー設定

        # 全体レイアウトのためのフレーム 縦にならべる(row)
        self.frame00 = tk.Frame(self.frame_wintop, relief='groove', bd=2)  # relief=枠線スタイル bd=枠線太さ
        self.frame01 = tk.Frame(self.frame_wintop, relief='groove', bd=2)
        # 配置 フレーム
        self.frame00.grid(row=0, column=0, padx=5, pady=5, sticky="nsew")
        self.frame01.grid(row=1, column=0, padx=5, pady=5, sticky="nsew")
        # グリッドの設定  全体ウィンドウの伸縮に、各部品が追従するにはこれが必須
        for i in range(3):
            #root.rowconfigure(i, weight=1)
            root.columnconfigure(i, weight=1)
        root.rowconfigure(1, weight=1) # 画面リサイズ時の、縦方向の部品リサイズ追従は 1のみ(canvasを含むもの)

        # 部品定義 0段目
        self.canvas1 = tk.Canvas(self.frame00)
        # 部品配置 0段目
        self.canvas1.pack(side="left", fill="both", expand=True, padx=5)

        # 部品定義 1段目
        self.button1 = ttk.Button(self.frame01, text="テスト", command=self.func_on_button1_cliecked)
        self.GUIvalue_slider1 = tk.DoubleVar()
        # 部品配置 1段目
        self.button1.pack(side='left')

        # ユーザーに見えやすくするための処理。 全体サイズでは大きすぎるので、起動時は小さいWindowで起動する
        #self.master.geometry("300x300")
        tmp_w = 200
        tmp_h = 100
        str_sizeWH = str(tmp_w) + "x" + str(tmp_h)
        self.master.geometry(str_sizeWH)

    def func_on_vertical_scroll(self, *args):
        # スクロールバーが動いた時の処理
        #self.canvas_wintop.yview
        self.scrollbarV.set(*args)
        if self.scrollbarV.get()[1] == 0.0:
            print("move_end")
        else:
            print("moved scrollV =", self.scrollbarV.get()[1])

    def func_on_button1_cliecked(self):
        tk.messagebox.showinfo("info", "[DEBUG] scrollbarV move_value=" + str(self.scrollbarV.get()[1]))


if __name__ == "__main__":
    root = tk.Tk()
    #app = Application(master=root)
    app = MainWindow(master=root)
    app.mainloop()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0