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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Q&A

解決済

1回答

1404閲覧

Python3 Tkinter スクロール可能なフレームを作成したら、バインドが正常に機能しない

person

総合スコア223

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

0グッド

0クリップ

投稿2022/02/17 07:48

編集2022/02/18 05:32

Tkinterで配置したウィジェットのフレームをスクロールできるように
コードを書いたのですが、bindが正常に機能しません。

サンプルコードと比較しても
bind()を記述する位置が悪いようにも思えないのですが、
なぜ正常に機能しないのでしょうか。

bind機能する(サンプル)

Python

1import tkinter as tk 2from tkinter import ttk 3 4class MyFrame(ttk.Frame): 5 def __init__(self, master): 6 super().__init__(master) 7 self.bind("<Button-1>", lambda e:print("test")) 8 9root = tk.Tk() 10root.geometry("400x300") 11 12frame = MyFrame(root) 13frame.pack(fill="both", expand=1) 14 15root.mainloop()

bind機能しない

Python

1import tkinter as tk 2from tkinter import ttk 3 4# 参考 5# https://qiita.com/shinno1993/items/3ea14ffd7f17d8214961 6 7class ScrollFrame(ttk.Frame): 8 def __init__(self, master, y=True, x=True): 9 super().__init__(master) 10 self.canvas = tk.Canvas(self) 11 self.scroll_frame = ttk.Frame(self.canvas) 12 self.scroll_frame.bind( 13 "<Configure>", lambda e: self.canvas.configure( 14 scrollregion=self.canvas.bbox("all") 15 ) 16 ) 17 18 self.canvas.create_window((0, 0), window=self.scroll_frame, anchor="nw") 19 20 if y: 21 self.ysb = tk.Scrollbar(self, width=30, orient="vertical", command=self.canvas.yview) 22 self.canvas.configure(yscrollcommand=self.ysb.set) 23 self.ysb.pack(side="right", fill="y") 24 25 if x: 26 self.xsb = tk.Scrollbar(self, width=30, orient="horizontal", command=self.canvas.xview) 27 self.canvas.configure(xscrollcommand=self.xsb.set) 28 self.xsb.pack(side="bottom", fill="x") 29 30 self.canvas.pack(side="left", fill="both", expand=True) 31 32 self.bind("<MouseWheel>", self.wheel_y) 33 self.bind("<Shift-MouseWheel>", self.wheel_x) 34 self.bind("<Button-1>", lambda e:print("Button-1")) 35 36 def wheel_y(self, e): 37 print("wheel_y") 38 self.canvas.yview_scroll(int(-1*(e.delta/120)), "units") 39 40 def wheel_x(self, e): 41 print("wheel_x") 42 self.canvas.xview_scroll(int(-1*(e.delta/120)), "units") 43 44 45def select_rb(e): 46 val = e.widget["value"] 47 txt = rbs[val - 1]["text"] 48 print(txt) 49 50 51if __name__ == "__main__": 52 root = tk.Tk() 53 54 root.rowconfigure(0, weight=1) 55 root.columnconfigure(0, weight=1) 56 57 scrollframe = ScrollFrame(root) 58 scrollframe.grid(row=0, column=0, sticky="nsew") 59 60 var = tk.IntVar() 61 rbs = [] 62 for i in range(30): 63 rb = ttk.Radiobutton( 64 scrollframe.scroll_frame, 65 text = "RadioButton" + str(i+1), 66 value = i+1, 67 variable = var) 68 rb.grid(sticky="w") 69 rb.bind("<Button-1>", select_rb) 70 rbs.append(rb) 71 72 # x方向scroll用 73 label = ttk.Label(scrollframe.scroll_frame, text="*"*100) 74 label.grid() 75 76 root.mainloop() 77 78 79

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

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

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

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

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

guest

回答1

0

自己解決

bind先を変更したら動きました。

Python

1 self.bind("<MouseWheel>", self.wheel_y) 2 self.bind("<Shift-MouseWheel>", self.wheel_x) 3 self.bind("<Button-1>", lambda e:print("Button-1"))

Python

1 self.scroll_frame.bind("<MouseWheel>", self.wheel_y) 2 self.scroll_frame.bind("<Shift-MouseWheel>", self.wheel_x) 3 self.scroll_frame.bind("<Button-1>", lambda e:print("Button-1"))

投稿2022/02/18 17:21

person

総合スコア223

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問