実現したいこと
現在独学で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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/04/30 04:34
2022/04/30 06:54
2022/04/30 08:15
2022/04/30 10:33
2022/05/01 03:58
2022/05/01 11:36
2022/05/02 03:21 編集
2022/05/02 08:31
2022/05/04 07:15