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

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

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

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

Python

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

Q&A

解決済

1回答

799閲覧

【tkinter】アプリ起動時、スクロールバー上下端の△▽が表示されない【Python】

netz-eng

総合スコア105

Tkinter

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

Python

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

0グッド

0クリップ

投稿2022/04/29 02:26

編集2022/05/04 12:58

実現したいこと

現在独学でGUI開発をしています。

tkinterでスクロールバーを実装したのですが、下図のようにはじめはスクロールバー上下端の△▽が表示されておらず
スクロールバーをクリックすると、△▽が現れます。

使用感に変わりはなく、ただGUIのデザイン的に気に入らないだけなのですが、もやもやしております。
app.mainloop()した時点で、△▽を表示させる方法はありますか?

イメージ説明
イメージ説明

該当のソースコード

Python

1import tkinter as tk 2app = tk.Tk() 3 4can = tk.Canvas(app, highlightthickness=0) 5 6ybar = tk.Scrollbar(app, orient=tk.VERTICAL, command=can.yview, takefocus=0) 7ybar.pack(side=tk.RIGHT, fill=tk.Y) 8can.configure(yscrollcommand=ybar.set) 9 10can.pack(side=tk.LEFT, fill=tk.BOTH) 11 12fra = tk.Frame(can, height=50) 13can.create_window((0, 0), window=fra, anchor=tk.NW, width=can.cget('width')) 14 15texs = [] 16for i in range(20): 17 tex = tk.Entry(fra, width=50) 18 texs.append(tex) 19 texs[i].insert(0, str(i)) 20 texs[i].pack(pady=5) 21 22app.update_idletasks() 23x = (texs[i].winfo_height()+10)*20 24can.config(scrollregion=(0, 0, 100, x)) 25can.config(height=150) 26 27app.mainloop()

試したこと(ttk.Scrollbar)

(A)スクロールバーをtk→ttkに変更しました。
下図のように指定しても背景色、スクロールバー横幅は変わらず
またウィジェット上にマウスカーソルがあるときのみ△▽が表示されます。

また、layout内にfocusに関する項目は見当たりません。
イメージ説明

Python

1ybar = ttk.Scrollbar(app, orient=tk.VERTICAL, command=can.yview) 2style = ttk.Style() 3style.configure("c.Vertical.TScrollbar", background="steelblue", arrowsize=50) 4ybar.configure(style="c.Vertical.TScrollbar") 5 6pprint(style.layout("c.Vertical.TScrollbar")) 7>[('Vertical.Scrollbar.trough', 8 {'children': [('Vertical.Scrollbar.uparrow', {'side': 'top', 'sticky': ''}), 9 ('Vertical.Scrollbar.downarrow', 10 {'side': 'bottom', 'sticky': ''}), 11 ('Vertical.Scrollbar.thumb', 12 {'expand': '1', 'sticky': 'nswe'})], 13 'sticky': 'ns'})]

(B)テーマを指定
テーマをdefaultに変更しました。外観が変わって△▽が表示されました。
が、その他の指定項目に変化はありません。
イメージ説明

Python

1style.theme_use("default")

ttk.Scrollbarの問題としては、以下が個人的なネックです。
タッチパッドでのスクロールに対応していない
→下記コードで、Entryにマウススクロールをbindすることで実装(なぜかEntryウィジェットの上以外でもマウススクロール関数が呼び出される)

色や横幅などを指定しても変更できない
→デフォルトのstyleのthemeはvistaで、winnativeに変えることで好みの外観に変更(色や横幅などの情報は相変わらず変更できない)

(◆style.layoutに、focusに関する項目がない。常に△▽を表示するには、用意されたテーマを使用する必要がある)

Python

1# マウススクロール関数 2def MouseScroll(event): 3 can.yview("scroll", int(-1*(event.delta/120)), "units") 4 5# ループ中にマウススクロール関数を各ウィジェットにbind 6tex[i].bind_all("<MouseWheel>", MouseScroll)

補足情報(FW/ツールのバージョンなど)

Windows11
Python 3.9.7
tk 8.6.11

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

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

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

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

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

guest

回答1

0

ベストアンサー

同環境にて、上記のコードで問題の現象は発生しませんでした。

対処法としては、scrollregion による設定値を見直してみてください。
固定値を加算してる辺りが環境に依存している可能性があります。
変数 x の値(※ scrollregion のy軸高さ height 指定) を小さくすると、発生しました。

高さの算出を、実際のフレームの高さ fra.winfo_reqheight() にしてみてはどうでしょう。
訂正: 自分の環境では 変数xの値と一致しました。問題の解決策としては、scrollregionのheight値の調整で出来るはずです。


win10/py3.9で実行。スクロールバーの外観が異なります。
イメージ説明

投稿2022/04/29 06:03

編集2022/05/01 04:00
teamikl

総合スコア8664

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

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

netz-eng

2022/04/30 04:34

同環境でご確認くださり、ありがとうございます。 scrollregionのy軸高さを、キャンバスに表示しているフレーム高さ以下に設定すると△▽が表示されましたが、 それでは結局スクロールバーが下まで移動しません。 上記コードxの値までスクロールすることと、△▽をアプリ起動状態で表示することはトレードオフなのでしょうか? ※問題解決しておりませんが、誤操作でBAボタン押してしまいました。
teamikl

2022/04/30 06:54

現象が再現・確認出来ないので、推測になりますが 「フレーム高さ以下に設定すると△▽が表示」は逆ではないですか? scrollregion(スクロール可能範囲)の値の方が大きくなるはずなので、 もし、scrollregionの方が小さい時しか矢印が表示されないとすれば、別問題の可能性があります。 あと気になる点は、スクロールバーの外観が自分の環境とは異なる、くらいかな、 > 上記コードxの値までスクロールすることと、△▽をアプリ起動状態で表示することはトレードオフなのでしょうか? その様なことはないはずです。
netz-eng

2022/04/30 10:33

>もし、scrollregionの方が小さい時しか矢印が表示されないとすれば、別問題の可能性があります。 現状、テキストボックス全てを含んだフレーム高さが580で、 アプリに表示しているキャンバス高さが150に設定してあります。 質問文内scrollregionのxの値を、150以下にしないと初期△▽が表示されません。(151以上はダメでした) 他、いろいろ試してみるとbackgroundやreliefなど、見た目に関するオプションを指定しても反映されない不具合が生じています。widthは問題なく指定できました。 既にいろいろとお考えいただいたとは思いますが、 何か解決に向けたお知恵などありますでしょうか?
teamikl

2022/05/01 03:58

私の環境では、「150以下にしないと表示されない」というのが再現出来ないので、 問題解決の為には原因の特定が先に必要です。 実行環境で何か特別な設定をしていたりすることはありませんか? こちらの環境ではスクロールバーの外観が違ってました。 またxの値に関わらず、矢印自体は表示されます。 回答内に質問のコードをwi10/py3.9で実行した画像を添付します。 - ライブラリを使って実装してみる   → 同じ現象が発生する場合は、コードではなく環境問題の可能性有 - pywinauto 等で開始時にスクロールバーをクリック (回避策)
netz-eng

2022/05/01 11:36

ご返信ありがとうございます。 いま、質問文のバージョン情報が誤っていることに気づきました。  Win10 → Win11 に訂正いたします。 誤った情報でお手間をとらせてしまい、申し訳ありません。 もしかすると、Windowsバージョン原因が異なることが原因かもしれません。 ご提案いただいた中ではpywinautoを用いる方法が、ひと手間必要ですが現実的な策に感じます。
teamikl

2022/05/02 03:21 編集

すみません、こちらもバージョン情報が正確ではありませんでした。 tk ライブラリのパッチレベルの違いにより、外観は異なるようです。tk 8.6.9 と 8.6.12 で確認。 但し、問題の現象はwin10では確認できずなので、 ライブラリ上流(tcl/tk のwin11対応状況) 側の可能性もありますね。 他の案: デフォルトテーマの外観の問題だとすると、tkinter.Scrollbar の代わりに tkinter.ttk.Scrollbar を使い、 ttk.Style で別テーマを試してみる等はどうでしょう。
teamikl

2022/05/02 08:31

クリックの代案をもうひとつ。動作検証は出来てませんが、クリックした時に呼び出される キャンバスやスクロールバーのメソッドを明示的に呼び出してみる。 mainloop呼び出し前に app.after_idle(can.yview_moveto, 0.0) もしくは app.after_idle(vbar.set, 0.0)
netz-eng

2022/05/04 07:15

なるほど、tkのバージョンで外観は異なるのですね。 >但し、問題の現象はwin10では確認できずなので、 >ライブラリ上流(tcl/tk のwin11対応状況) 側の可能性もありますね。 お話を伺っていて、自分もそこに原因があるように感じています。 >app.after_idle(can.yview_moveto, 0.0) >もしくは >app.after_idle(vbar.set, 0.0) そのままではエラーが出たため、app.after_idle(vbar.set, 0.0) → app.after_idle(ybar.set, 0.0, 0.0) としてmainloop()前に入れてみましたが、外観上の変化は見られませんでした。 ttk.Scrollbarの場合、デフォルトではマウスフォーカス時のみ△▽が表示されています。 おっしゃる通りテーマをdefautなどに指定するとデザインが変わり、△▽が表示されるようになりました。 が、ttkでは以下3点、個人的に解決したい問題が発生しています。 ①スクロールバーがタッチパッドでのスクロールに対応していない(tk.Scrollbarでは対応していた。ttkではスクロールバーをクリック保持して動かさないとスクロールされない) ②pprintで確認したところ、style.layout内にfocusに関する項目が見当たらない(テーマを指定しないと△▽表示に関する問題が解消されない) ③スクロールバー横幅をarrowsize=で指定しても反映されない 質問文にも追記いたしますが、 ttk.Scrollbarの仕様に関しては、主題が異なってくるので、別に質問しようかと思っております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問