質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

2回答

8026閲覧

tkinter で縦スクロールを付けたい

rei0

総合スコア14

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

1グッド

2クリップ

投稿2019/05/16 04:25

tkinter 8.6.8
python3.7.1(anaconda 2018.12)

上記の環境で画面を作成しています。
【1】画面の縦幅を狭くした際に、そのスクロールが動作する方法が分かりません。(画面上に表示されていますが動きません。)
【2】画面右端に画面いっぱいの長さの縦スクロールを付けたいです。

なお画面左部はgrid,packではなく、placeでレイアウトを作成しています。(今後細かくレイアウトを作成する予定のため、placeで一つひとつのウィジェットの位置を指定する必要があります。)

よろしくお願いします。

python3

1import tkinter 2 3root = tkinter.Tk() 4root.geometry("500x500") 5 6bar = tkinter.Scrollbar() 7bar.place(x=480, y=0) 8 9aaa = tkinter.Label(text='aaa') 10aaa.place(x=20, y=20) 11 12 13bbb = tkinter.Label(text='bbb') 14bbb.place(x=20, y=40) 15 16ccc = tkinter.Label(text='ccc') 17ccc.place(x=20, y=450) 18 19 20root.mainloop()
MM921👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

基本的な考え方としては

・Top Widget(root)上に Frame WidgetとScrollbarを置く
・各ラベルは TopWidget上ではなく、Frame上に置く
・ScrollbarでFrame Widgetの描画範囲を制御する

となります。が残念ながら Frame WidgetはScrollbarに対応しておりません。

そこで、まず Scrollbarに対応している Canvas Widget をTop Widget上に配置し、そのCanvas Widget上に Frame Widgetを配置する(各ラベルはこの上配置)と良いかと思います。

以下は動作サンプル

Python

1import tkinter as tk 2 3root = tk.Tk() 4root.geometry("500x500") 5 6# Canvas Widget を生成 7canvas = tk.Canvas(root) 8 9# Top Widget上に Scrollbar を生成して配置 10bar = tk.Scrollbar(root, orient=tk.VERTICAL) 11bar.pack(side=tk.RIGHT, fill=tk.Y) 12bar.config(command=canvas.yview) # ScrollbarでCanvasを制御 13 14# Canvas Widget をTopWidget上に配置 15canvas.config(yscrollcommand=bar.set) # Canvasのサイズ変更をScrollbarに通知 16canvas.config(scrollregion=(0,0,500,500)) #スクロール範囲 17canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) 18 19# Frame Widgetを 生成 20frame = tk.Frame(canvas) 21 22# Frame Widgetを Canvas Widget上に配置() 23canvas.create_window((0,0), window=frame, anchor=tk.NW, width=500, height=500) 24 25# Frame Widget上に各種ラベルを表示 26aaa = tk.Label(frame, text='aaa') 27aaa.place(x=20, y=20) 28 29bbb = tk.Label(frame, text='bbb') 30bbb.place(x=20, y=40) 31 32ccc = tk.Label(frame, text='ccc') 33ccc.place(x=20, y=450) 34 35ddd = tk.Label(frame, text='ddd') 36ddd.place(x=450, y=450) 37 38root.mainloop()

投稿2019/05/16 10:36

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rei0

2019/05/17 02:44

丁寧にご回答していただいてありがとうございました。 謎が解けました。長いこと考えていたので、とても助かりました。
rei0

2019/05/23 04:16

お世話になります。 教えていただいた内容ですと、ホイールでのスクロールが使用できなかったため、再度調べています。 root.bind("<MouseWheel>") 上記のようにマウスの動作をバインドするとよいと書いてあるものがあったので、それをもとに試行錯誤しています。 ご存じでしたらご教授いただければと思います。 そうでなければ新規で質問してみます。 よろしくお願いいたします。
magichan

2019/05/23 23:49 編集

canvas.pack(...) の前行あたりに ''' canvas.bind_all("<MouseWheel>", lambda eve:c anvas.yview_scroll(int(-eve.delta/120), 'units')) ''' の一行を入れてみてください。
rei0

2019/05/24 02:52

早速のご回答ありがとうございます。 教えていただいた内容で、上手く動作しました。 ありがとうございます。
guest

0

こんにちは。

問題文読ませていただきました。

Label Widgetを使ってscrollbarを実装するのは難しいので、

1.canvas Widgetを作成
2.canvas Widget内へLabel Widgetを配置する。

が良さそうです。

canvas Widget内へscrollbarを実装する方法はこちらの記事の「その他のWidgetを使った、scrollbar Widgetサンプル集」内でまとまっていますので、ご確認いただけますと幸いです。????‍♂️

Tkinterで使われるscrollbarとは?活用事例を交えて徹底解説

投稿2021/06/01 08:16

編集2021/06/16 00:16
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問