実現したいこと
独学でGUIを開発しております。
マウススクロールをバインドしたフレーム内にコンボボックスを配置し、
コンボボックスのプルダウンリストを表示した状態で、
コンボボックスの外(フレーム部分)をマウススクロールしたとき、
プルダウンリストをしまいたいのですが、コードの書き方がわかりません。
現状では、プルダウンリストがある状態でコンボボックスの外でマウススクロールをすると、
プルダウンリストが表示されたまま画面がスクロールされてしまいます。
マウススクロール時に呼び出される関数のなかで、winfo_exists
でpopdown
の存在を判定すればよいと思うのですが、
ループでコンボボックスを作成しているため、ウィジェット変数名がなく判定ができません。
解決方法にお心当たりがあれば、ご回答よろしくお願いします。
該当のソースコード
Python
1import tkinter as tk 2import tkinter.ttk as ttk 3 4app = tk.Tk() 5fra_outcan = tk.Frame(app) 6fra_outcan.grid(row=1, column=0) 7# can = tk.Canvas(app) 8can = tk.Canvas(fra_outcan, highlightthickness=0) 9 10ybar = ttk.Scrollbar(fra_outcan, orient=tk.VERTICAL, command=can.yview, takefocus=0) 11ybar.grid(row=0, column=1, sticky=tk.N+tk.S) 12can.configure(yscrollcommand=ybar.set) 13can.grid(row=0, column=0, pady=10) 14 15def MouseScroll(event): 16 w = event.widget 17 sw = str(w) 18 #プルダウンリスト上でマウススクロールした場合は、リスト内をスクロールする 19 if not "popdown" in sw: 20 can.yview("scroll", int(-1*(event.delta/120)), "units") 21 22fra_incan = tk.Frame(can, height=50) 23can.create_window((0, 0), window=fra_incan, anchor=tk.NW, width=can.cget('width')) 24 25fra_incan.bind_all("<MouseWheel>", MouseScroll) 26 27texs = [] 28lst_cb = list(range(20)) 29for i in range(20): 30 tex = ttk.Combobox(fra_incan, width=50, values=lst_cb) 31 texs.append(tex) 32 tex.set(i) 33 # すべてのコンボボックスからマウスホイールを除去 34 app.unbind_class("TCombobox", "<MouseWheel>") 35 # マウススクロール関数をバインド 36 texs[i].bind_all("<MouseWheel>", MouseScroll) 37 texs[i].pack(pady=5) 38 39app.update_idletasks() 40x = (texs[i].winfo_height()+10)*10 41can.config(scrollregion=(0, 0, 100, x)) 42can.config(height=150) 43fra_outcan.config(relief=tk.RAISED, borderwidth=5) 44print(str(x)) 45 46ybar.configure(style="c.Vertical.TScrollbar") 47 48app.mainloop()
補足情報(FW/ツールのバージョンなど)
Windows11
Python 3.9.7
tk 8.6.11

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/06/29 12:42