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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

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

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4365閲覧

python3 tkinter frameにスクロールバーを表示してスクロールしたい

nanorunamonai

総合スコア34

Tkinter

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

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2020/08/04 17:50

概要

tkinterを用いてアプリケーションを作成しています。
GUIは以下のような構造になっており、
Frame2に大量にチェックボタン(チェックボックス)が並んでいます。

やりたいこと

Frame2のみにスクロールバーを表示し、垂直・水平方向にスクロールさせたいです。

GUIイメージ

現状

方法を調べていくうち、メインウィンドウ(tkinter.TK())やフレーム(tkinter.Frame)クラスにはスクロールバーは設定できず、tkinter.Canvasクラスにフレームを対応させることが分かりましたが、FrameクラスとCanvasクラスの使用方法が間違っているのかスクロールできません。

スクロールバーは表示されるのですが、スクロールができない状態です。

現状のプログラムの関係ある部分です。
オブジェクト指向でなく申し訳ありません。

root = tkinter.Tk() #メインウィンドウ生成 : : #メインフレーム生成 mainFrame = tkinter.Frame(root, ...) mainFrame.pack() #Frame1を生成 frame1 = tkinter.Frame(mainFrame, ...) frame1.pack() #Frame2を生成 frame2 = tkinter.Frame(mainFrame, ...) frame2.pack() # Canvas生成 canvas=tkinter.Canvas(frame2, ...) # 垂直・水平方向のスクロールバー生成 hbar=Scrollbar(frame2,orient=tkinter.HORIZONTAL) hbar.pack(side=tkinter.BOTTOM,fill=tkinter.X) hbar.config(command=canvas.xview) vbar=Scrollbar(frame2,orient=tkinter.VERTICAL) vbar.pack(side=tkinter.RIGHT,fill=tkinter.Y) vbar.config(command=canvas.yview) : : # チェックボックス生成 (Nはチェックボックスの個数) for i in range(0, N): : : chk = tkinter.Checkbutton(frame2, ...) : # canvasとスクロールバー対応 canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) canvas.pack()

質問

スクロールする方法をご教示ください。
よろしくお願いいたします。

teamikl👍を押しています

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

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

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

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

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

guest

回答2

0

こんばんは。

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

width(幅)、height(高さ)を設定する以外にも、canvas Widgetがscrollできる領域を設定するオプションscrollregionが必要になりますね。

投稿2021/06/01 10:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

キャンバスでスクロール可能にするには scrollregion
スクロール可能な領域を指定します。

canvas.config(scrollregion=canvas.bbox("all"))

ですが、現状のコードではキャンバスに何も描画されておらず、
canvas.bbox("all") は None になる為、他にも修正が必要です。

  • Checkbox は frame2 上に配置 pack() や grid() が必要です。
  • frame2 はキャンバス外に配置されているため、親を canvas に指定して

 frame2.pack() ではなく canvas.create_window でキャンバス内に描画

  • 確認方法: print(canvas.bbox("all")) で範囲のタプルが正常に表示されてば成功です。
    (0, 0, 1, 1) と表示される場合は、直前に canvas.update_idletasks() を呼んでください。

出来ればコードは、問題が再現する最小限のコードを作って
そのままコピーして実行可能な形での掲載をお願いします。
他に、省略されてる部分に問題が有ることもありますし、動作確認が出来ません。


python

1import tkinter as tk 2 3root = tk.Tk() 4canvas = tk.Canvas(root, width=400, height=400) 5frame = tk.Frame(canvas) 6 7for row in range(40): 8 for column in range(20): 9 text = "({}, {})".format(row, column) 10 chk = tk.Checkbutton(frame, text=text) 11 chk.grid(row=row, column=column) 12 13# スクロールバーの配置 14hbar = tk.Scrollbar(root, orient=tk.HORIZONTAL) 15hbar.config(command=canvas.xview) 16hbar.pack(side=tk.BOTTOM, fill=tk.X) 17vbar = tk.Scrollbar(root, orient=tk.VERTICAL) 18vbar.config(command=canvas.yview) 19vbar.pack(side=tk.RIGHT,fill=tk.Y) 20 21canvas.create_window(0, 0, window=frame) 22canvas.pack(fill=tk.BOTH, expand=True) 23canvas.update_idletasks() 24 25canvas.config( 26 scrollregion=canvas.bbox("all"), 27 xscrollcommand=hbar.set, 28 yscrollcommand=vbar.set) 29# スクロールバー位置のリセット 30canvas.xview_moveto(0) 31canvas.yview_moveto(0) 32 33print(canvas.bbox("all")) 34root.mainloop() 35 36

投稿2020/08/05 00:17

編集2020/08/05 00:28
teamikl

総合スコア8760

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

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

nanorunamonai

2020/08/05 15:54

非常にわかりやすい解説で実装できました。 ありがとうございました。 別の機会に質問の際は実行可能なコードを掲載するように注意いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問