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

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

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

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

Python

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

Q&A

解決済

2回答

3860閲覧

pythonのTkinterで,Buttonを多数配置したCanvasと,Scrollbarとを紐づかせたが、上手くいかない

urue

総合スコア15

Tkinter

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

Python

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

0グッド

0クリップ

投稿2022/04/01 15:36

多数のButtonウィジェットをCanvasウィジェット上に縦に配置し、スクロールできるようにいろいろ試してみたのですが、スクロールできるようになりません。以下のソースコードをどのように改善すればよいでしょうか。
Pythonのバージョンは3.10.1です。

Python

1from tkinter import * 2from tkinter.font import Font 3 4#ウィンドウ 5root = Tk() 6root.geometry('600x400') 7root.resizable(width = False, height = False) 8 9#フォント 10font = Font(root, size = 20) 11 12#キャンバス 13cvs = Canvas(root) 14 15#縦スクロールバー 16scr = Scrollbar(root, orient = VERTICAL) 17 18#紐づけ 19scr.config(command = cvs.yview) 20cvs.config(yscrollcommand = scr.set) 21 22#ボタン(15個) 23button_list = [] 24for i in range(15): 25 button_list.append( 26 Button( 27 cvs, 28 text = f'ボタン{i+1}', 29 font = font, 30 ) 31 ) 32 33#各ウィジェットを配置 34scr.pack(side = RIGHT, fill = Y) 35cvs.pack(side = RIGHT) 36for button in button_list: 37 button.pack(side = TOP) 38 39#ウィンドウ表示 40root.mainloop()

上記ソースコードの実行結果↓
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

Canvas 内でスクロールしたい場合は、
create_window でキャンバス内のアイテムとして配置する必要があります。

現状のコードでは、Canvas 上に
ウィジェットのレイアウトマネージャ(pack/grid) で配置しています。

率直な解決策としては、pack で配置してる箇所を cvs.create_window での配置に変更ですが、
create_window では座標指定が必要になってくるので、間に Frame を嚙ませるといいかもしれません。

  • Button を Frame 上に配置する
  • Frame を create_window で Canvas 内アイテムとして配置する

以上でボタンがキャンバス内のスクロール対象になるはずですが、
望み通りの挙動にするには、他にレイアウトの問題があります。
キャンバスの縦幅とスクロールバーの長さがあわなくなるので、適宜調整してください。(cvs.pack の fill 辺り)

投稿2022/04/01 21:09

編集2022/04/01 21:20
teamikl

総合スコア8817

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

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

urue

2022/04/01 21:29

回答ありがとうございます。早速試してみたいと思います。
guest

0

以下のソースコードで、表示が少し変ですが、ボタン部分がスクロールできるようになりました。質問文のソースコードからの変更・追記は以下の四つです

  • Canvas に scrollregion パラメータを設定
  • Canvas を親ウィジェットとする Frame を新たに生成
  • Button の親ウィジェットを、新たに生成した Frame に設定
  • Frame を pack ではなく、Canvas の create_window で配置

Python

1from tkinter import * 2from tkinter.font import Font 3 4#ウィンドウ 5root = Tk() 6root.geometry('600x400') 7root.resizable(width = False, height = False) 8 9#フォント 10font = Font(root, size = 20) 11 12#キャンバス 13cvs = Canvas( 14 root, 15 scrollregion = (0, 0, 100, 1000), 16) 17 18#縦スクロールバー 19scr = Scrollbar(root, orient = VERTICAL) 20 21#紐づけ 22scr.config(command = cvs.yview) 23cvs.config(yscrollcommand = scr.set) 24 25#フレーム 26frm = Frame(cvs) 27 28#ボタン(15個) 29button_list = [] 30for i in range(15): 31 button_list.append( 32 Button( 33 frm, 34 text = f'ボタン{i+1}', 35 font = font, 36 ) 37 ) 38 39#各ウィジェットを配置 40scr.pack(side = RIGHT, fill = Y) 41cvs.pack(side = RIGHT) 42cvs.create_window(0, 0, window = frm, anchor = NW) 43for button in button_list: 44 button.pack(side = TOP) 45 46#ウィンドウ表示 47root.mainloop()

投稿2022/04/02 21:43

urue

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問