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

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

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

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

スクロール

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

Python

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

Q&A

解決済

2回答

3165閲覧

python3のtkinterでスクロールバー が動かない

Yuiti628

総合スコア71

Tkinter

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

スクロール

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

Python

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

0グッド

0クリップ

投稿2021/02/23 06:58

編集2021/02/23 09:02

pythonでGUIを作成しています。

機能の一部に、アカウント名とメールアドレスを任意の数記入する場所を作りたいと思っています。
記入する場所をスクロールできるようにしたいとのですがバーが動かなくて困っています。

該当のコードを記載しました。ここだけでもラベルが7のところまでしか表示できず、バーが動いていません。

python

1# tkinter 2from tkinter import * 3import tkinter as tk 4 5class Application(Frame): 6 7 def __init__(self, master=None): 8 Frame.__init__(self,master) 9 master.configure(bg="white") 10 self.pack() #描写 11 self.create_widgets(master) #フォームの作成 12 13 14 15 #フォームの作成 16 def create_widgets(self,master): 17 18 """ 19 スクロールバー Canvas 20 """ 21 22 # フォルダー表示 フレーム 23 frm = Frame(master) 24 frm.pack(padx=10 ,pady=15 , fill="both",expand=1) 25 26     #指摘を頂き変更 27 #canvas = Canvas(frm, width=400, height=150 ,bg="red",scrollregion=(0,0,400,400)) 28 canvas = Canvas(frm, width=400, height=150 ,bg="red") 29 30 31 bar = Scrollbar(frm, orient=VERTICAL) 32 # 指摘を頂き修正 33 #bar.grid(row=0, column=1, sticky="nw") 34 bar.grid(row=0, column=1, sticky="ns") 35 bar.config(command=canvas.yview) 36 37 38 canvas.config(yscrollcommand=bar.set) 39 canvas.grid(row=0, column=0, sticky="news") 40 41 42 # Canvas Widget を配置 43 cframe=Frame(canvas, width=canvas.cget('width')) 44 canvas.create_window((0, 0), window=cframe, anchor="nw") 45 46 47 self.Widget_items = [] 48 for i in range(10): 49 items = [] 50 51 # アカウント名 ラベル 52 L_no = tk.Label(cframe) 53 L_no.configure(text=f"{i+1}", bg="white") 54 L_no.grid(row=i +1, column=0, sticky="nw") 55 items.append(L_no) 56 57    #指摘を頂き追加 58    canvas.update_idletasks() 59    canvas.config(scrollregion=canvas.bbox("all")) 60 61 62if __name__ == "__main__": 63 64 root = Tk() 65 app = Application(master=root) 66 app.mainloop() 67 68 69

他のを調べて、
bar.config(command=canvas.yview) canvas.config(yscrollcommand=bar.set)
ここが重要であると思って追加しているのですが、あとは何が原因でしょうか?

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

Mac と tkinterの相性の問題だったようです。

https://www.python.org/download/mac/tcltk/

こちらより、最新のpythonを入れると問題なく動作しました

投稿2021/02/23 11:05

Yuiti628

総合スコア71

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

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

0

ベストアンサー

diff

1- bar.grid(row=0, column=1, sticky="nw") 2+ bar.grid(row=0, column=1, sticky="ns")

スクロールバーを縦方向に伸ばすには ns を指定します


イメージ説明

投稿2021/02/23 07:11

編集2021/02/23 09:16
teamikl

総合スコア8664

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

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

Yuiti628

2021/02/23 07:16

ありがとうございます。 方向のことは完全に抜けておりました。 恐らくこれも原因のようですが、他にもあるようで動きませんでした????‍♂️
teamikl

2021/02/23 07:38 編集

上記の修正のみで動作確認出来ましたが、 動かないとはどのような状況ですか? - スクロールバーは動くが、左のキャンバス内の画面が追従しない - スクロールバー自体が動かない ---- > bar.config(command=canvas.yview) > canvas.config(yscrollcommand=bar.set) > ここが重要であると思って追加しているのですが、あとは何が原因でしょうか? 他に重要な点は、scrollregion です。 スクロール領域が実際のキャンバスのサイズより狭い場合はスクロールしません。 対策: フォームにサイズを合わせる。create_widgetsメソッドの末尾で # この時点ではサイズが決まってない為、updateで描画更新 canvas.update_idletasks() canvas.config(scrollregion=canvas.bbox("all"))
Yuiti628

2021/02/23 09:01

ありがとうございます。 状況ですが、 - スクロールバー自体が動かない となります。 次に、scrollregionですが >canvas = Canvas(frm, width=400, height=150 ,bg="red",scrollregion=(0,0,400,400)) としておりますので、スクロール範囲の方が大きいと思っておりました。 末尾に canvas.update_idletasks() canvas.config(scrollregion=canvas.bbox("all")) を追加しましたが、変化は見られ内容です。
teamikl

2021/02/23 09:20

> スクロール範囲の方が大きいと思っておりました。 scrollregion の方が大きければ問題ありませんが、 region の範囲はマイナス座標を含む点にだけ注意。 create_window で指定した座標は、左上ではなく中心になります。 ---- 他に質問に掲載のコードと実行したコードに差異が無ければ、 実行環境の問題かもしれません。 エディタや開発環境の実行では、 編集中のコードと実行してるコードが違っていたという事もあるので、 ファイル名や場所を確認して、確認の為に端末から実行して見て下さい。
teamikl

2021/02/23 09:25 編集

訂正
Yuiti628

2021/02/23 09:40

そんなまさかと思いながらも、windowsで実行すると問題なく動きました. 開発環境がMacだったことが原因だったようです。 解決方法を探したいと思います。 ありがとうございました。
teamikl

2021/02/23 09:57

実行環境の違いだったのですね。 Mac だと tk 自体が複数の実装があったりするので、 Apple提供ではなく、pythonr.org公式のものがお勧めされてるようです。 https://www.python.org/download/mac/tcltk/ ---- 後、正常に動いたとして必要になりそうな部分 (scrollregionについて) 開始時は、キャンバスの座標 (0, 0) が表示されるが create_window で指定した座標は ウィジェットの中央になる為 (0, 0) を指定すると、スクロールバーが中央あたりになってしまいます。 例: サイズ 400x400 のウィジェットを 0, 0 に配置すると、 スクロールに指定する領域は -200,-200 ~ 200,200 # 最後に、スクロールバーの位置をリセット canvas.yview_moveto(0)
Yuiti628

2021/02/23 11:04

ありがとうございます! リンクから3.9.2を入れて実行すると動作しました!!! 本当に助かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問