为什么我的 scrolbar 在点击按钮几次后没有出现?



我制作了框架,在框架内还有其他框架——最里面的框架中有条目。(粘贴的代码中没有包括条目,因为它太长了(通过单击按钮,我在新行中添加了一个新框架。当我添加了太多帧以至于屏幕满了时,滚动条应该可以滚动。但事实并非如此,滚动条由于某种原因没有显示。

from tkinter import *
from tkinter import ttk
root = Tk()
root.state('zoomed')
class Window:
def __init__(self, master):
this_is_a_frame = Frame(master)
this_is_a_frame.pack(fill=BOTH, expand=1)
self.this_is_a_canvas = Canvas(this_is_a_frame)
self.this_is_a_canvas.pack(side=LEFT, fill=BOTH, expand=1)
this_is_a_scrollbal = ttk.Scrollbar(this_is_a_frame, orient=VERTICAL, command=self.this_is_a_canvas.yview)
this_is_a_scrollbal.pack(side=RIGHT, fill=Y)
self.this_is_a_canvas.configure(yscrollcommand=this_is_a_scrollbal.set)
self.this_is_a_canvas.bind('<Configure>',
lambda e: self.this_is_a_canvas.configure(
scrollregion=self.this_is_a_canvas.bbox('all')))
this_second_frame = Frame(self.this_is_a_canvas)
self.this_is_a_canvas.create_window((0, 0), window=this_second_frame, anchor='nw')
self.main_frame = Frame(this_second_frame)
self.main_frame.pack()
self.main_frame.configure(bg='pink')
self.my_frame = Frame(self.main_frame, highlightbackground="orange", highlightthickness=2)
self.my_frame.pack()
self.my_frame.configure(bg='green')
self.my_other_frame = Frame(this_second_frame)
self.my_other_frame.pack()
self.my_other_frame.configure(bg='blue')
self.col = 4
for j in range(9):
self.myLab = Label(self.my_frame, text='label').grid(row=0, column=j + 1)
self.myLab_2 = Label(self.my_frame, text='label').grid(row=2, column=j + 1)
for k in range(1):
self.myEntry_loop = Entry(self.my_frame)
self.myEntry_loop.grid(row=k + 1, column=j + 1, pady=10, padx=10)
self.myEntry_loop_2 = Entry(self.my_frame)
self.myEntry_loop_2.grid(row=k + 3, column=j + 1, pady=10, padx=10)
self.myButton_newLevel = Button(self.my_other_frame, text="new frame", command=self.new_level)
self.myButton_newLevel.grid(row=self.col, column=0, padx=10)
def _on_mouse_wheel(event):
self.this_is_a_canvas.yview_scroll(-1 * int((event.delta / 120)), "units")
self.this_is_a_canvas.bind_all("<MouseWheel>", _on_mouse_wheel)
def new_level(self):
self.my_frame = Frame(self.main_frame, highlightbackground="orange", highlightthickness=2)
self.my_frame.pack(side=TOP, fill=X)
for j in range(9):
self.myLab = Label(self.my_frame, text='new label').grid(row=0, column=j + 1)
self.myLab_2 = Label(self.my_frame, text='new label').grid(row=2, column=j + 1)
for k in range(1):
self.myEntry_loop = Entry(self.my_frame)
self.myEntry_loop.grid(row=k + 1, column=j + 1, pady=10, padx=10)
self.myEntry_loop_2 = Entry(self.my_frame)
self.myEntry_loop_2.grid(row=k + 3, column=j + 1, pady=10, padx=10)

val = Window(root)
root.mainloop()

那么,我做错了什么?当屏幕上满是相框时,我如何向下滚动?

如果在错误的窗口小部件上绑定<Configure>事件,则应该在this_second_frame而不是self.this_is_a_canvas:上绑定

"""
# not bind on "self.this_is_a_canvas"
self.this_is_a_canvas.bind('<Configure>',
lambda e: self.this_is_a_canvas.configure(
scrollregion=self.this_is_a_canvas.bbox('all')))
"""
this_second_frame = Frame(self.this_is_a_canvas)
self.this_is_a_canvas.create_window((0, 0), window=this_second_frame, anchor='nw')
# bind on "this_second_frame" instead
this_second_frame.bind('<Configure>',
lambda e: self.this_is_a_canvas.configure(
scrollregion=self.this_is_a_canvas.bbox('all')))

最新更新