質問: いつもお世話になっております。 Python 2.7のTkinterを用いてGUIアプリにスクロールが できる(ブラウザを見るときのような全体をスクロールできる) 機能を付けたいです。 様々なサイトを参考にしてみたのですが解決できませんでした。 垂直方向にまずはスクロールできるようにしたいのですが、 どのようにすればよろしいでしょうか。 その際クラスは用いずにご説明していただけましたら、幸いです。 お手数をおかけいたしますが、よろしくお願いいたします。
回答: どのような **Widget** を配置したいのかが書かれていないので想定となりますが、例えば **Canvas Widget** に **Scroll Bar** を付ける場合は以下のように * **Root Window** 上に **Scrollbar Widget** と **Canvas Widget** を配置 * `Scrollbar.config(command=Canvas.yview)` にて**Scrollbar**を動かしたときに**Canvas**に通知する処理を追加 * `Canvas.config(scrollregion=())` にてScrollの範囲を設定 * `Canvas.config(yscrollcommand=Scrollbar.set)` にて**Canvas**の可動域を**Scrollbar**に通知する処理を追加 で動作するかと思います。 ``` # -*- coding: utf-8 -*- import Tkinter as tk root = tk.Tk() root.geometry("400x200") # Canvas Widget を生成して配置 canvas = tk.Canvas(root) canvas.pack(side=tk.LEFT, fill=tk.BOTH) # Scrollbar を生成して配置 bar = tk.Scrollbar(root, orient=tk.VERTICAL) bar.pack(side=tk.RIGHT, fill=tk.Y) # Scrollbarを制御をCanvasに通知する処理を追加 bar.config(command=canvas.yview) # Canvasのスクロール範囲を設定 canvas.config(scrollregion=(0,0,400,400)) # Canvasの可動域をScreoobarに通知する処理を追加 canvas.config(yscrollcommand=bar.set) # Canvas上に適当な図形を書いておく id = canvas.create_oval(10, 10, 370, 370) canvas.itemconfigure(id, fill = 'red') root.mainloop() ``` **Frame Widget** は残念ながら **Scrollbar** をサポートしていないのですが、上記の **Scrollbar**付きの **Canvas Widget** 上に **Frame Widget** を配置することで対応できるかと思います。 ``` # -*- coding: utf-8 -*- import Tkinter as tk root = tk.Tk() root.geometry("400x200") # Canvas Widget を生成 canvas = tk.Canvas(root) canvas.pack(side=tk.LEFT, fill=tk.BOTH) # Scrollbar を生成して配置 bar = tk.Scrollbar(root, orient=tk.VERTICAL) bar.pack(side=tk.RIGHT, fill=tk.Y) # Scrollbarを制御をCanvasに通知する処理を追加 bar.config(command=canvas.yview) # Canvasのスクロール範囲を設定 canvas.config(scrollregion=(0,0,400,400)) # Canvasの可動域をScreoobarに通知する処理を追加 canvas.config(yscrollcommand=bar.set) # Frame Widgetを 生成 frame = tk.Frame(canvas) # Frame Widgetを Canvas Widget上に配置 canvas.create_window((0,0), window=frame, anchor=tk.NW, width=canvas.cget('width')) # Frame上に適当なコンテンツを配置 tk.Label(frame, text="Hello World!!", font=("",24)).pack() root.mainloop() ```