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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。