【问题标题】:Tkinter - Scrollbar does not resize when number of labels inside a frame changesTkinter - 当框架内的标签数量发生变化时,滚动条不会调整大小
【发布时间】:2020-10-09 18:23:50
【问题描述】:

我正在尝试创建一个 GUI,其中左侧是 Listbox(包含在框架 f2 内),显示员工 ID,右侧是另一个框架 second_frame(包含在画布内和外框架 @987654324 @),以标签的形式显示每个选定员工的交易详情。

每个员工可以进行多项交易。因此,标签的数量必须是动态的,即对于listbox 中的第一个选定项目,可能有两个标签,而对于listbox 中的第二个选定项目,它可能是一百个。对于每个选择,我调用两个函数来销毁旧标签和创建新标签。虽然代码工作正常,但我无法根据选定的 listbox 条目调整滚动条的大小。我是 Tkinter 的新手,请指教。下面是我的代码。

另请注意,从任何函数外部调用 test() 函数时会显示滚动条,但从任何函数内部调用时不会显示任何内容。

# -*- coding: utf-8 -*-
from tkinter import *

'''def test():
    for i in range(0,50):
        for j in range (0,7):
            Label(second_frame, text=f'{i}{j}', width=20).grid(row=i, column=j, pady=5,padx=5)
'''
# --- function ---
def destroy_frame():
    #f1.grid_forget()
    print("destroying frame")
    for label in second_frame.winfo_children():
        label.destroy()

def create_frame(val):
    print("creating new frame")
    for i in range(0,val):
        for j in range (5):
            Label(second_frame, text=f'{i} {j} ', relief=GROOVE, width=10).grid(row=i, column=j, pady=5,padx=5)

def on_selection(event):
    # here you can get selected element
    print('previous:', listbox.get('active'))
    print(' current:', listbox.get(listbox.curselection()))

    # or using `event`
    print('(event) previous:', event.widget.get('active'))
    print('(event)  current:', event.widget.get(event.widget.curselection()))

    print (listbox.get(listbox.curselection()))

    if (listbox.get(listbox.curselection()) == "Eid 1"):
        destroy_frame()
        create_frame(100)

    elif (listbox.get(listbox.curselection()) == "Eid 2"):
        destroy_frame()
        create_frame(200)

    print('---')


root = Tk()
root.geometry('800x500')

#Create base Frames
f1 = Frame(width=800, height=50, bg="yellow", colormap="new")
f1.grid(row=0, columnspan=2)
f1.grid_propagate(False)

f2 = Frame(width=200, height=425, bg="light blue", colormap="new")
f2.grid(row=1, column=0)
f2.grid_propagate(False)

f3 = Frame(width=600, height=425, bg="light green", colormap="new")
f3.grid(row=1, column=1)
f3.grid_propagate(False)

#Create header Label
l1_f1 = Label(f1, text="Employee Purchase Entries:", bg="yellow")
l1_f1.grid(row=0, column=0)

#Create Listbox
listbox = Listbox(f2, bg="light blue", width=40, height=400)
listbox.grid(row=0, column=0)

#Add Scrollbar to ListBox
list_scrollbar = Scrollbar(f2)
list_scrollbar.grid(row=0, column=1, sticky=NSEW)

#Enter Listbox Data
listbox.insert(1, 'Eid 1')
listbox.insert(2, 'Eid 2')

listbox.bind('<<ListboxSelect>>', on_selection)

#configure the Listbox and Scrollbar
listbox.config(yscrollcommand  = list_scrollbar.set)
list_scrollbar.config(command = listbox.yview)

#Create a Canvas
my_canvas = Canvas(f3, width=580, height=425, bg="light green")
#my_canvas.pack(side=LEFT, fill=BOTH, expand=1)
my_canvas.grid(row=0, column=0)

#Add a Scrollbar to the canvas
my_scrollbar = Scrollbar(f3, orient=VERTICAL, command=my_canvas.yview)
my_scrollbar.grid(row=0, column=1, sticky=NSEW)

#configure the canvas
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind('<Configure>', lambda e : my_canvas.configure(scrollregion = my_canvas.bbox("all")))

#Create another frame inside the canvas
second_frame = Frame(my_canvas)

#Add the new frame to a window in the canvas
my_canvas.create_window((0,0), window=second_frame, anchor="nw")


#test()

root.mainloop()

【问题讨论】:

    标签: python tkinter scrollbar tkinter-canvas


    【解决方案1】:

    当您将小部件添加到框架时,您的画布不会触发配置事件。相反,您的框架已被触发。

    所以你需要把这一行:

    second_frame.bind('<Configure>', lambda e : my_canvas.configure(scrollregion = my_canvas.bbox("all")))
    

    创建second_frame之后

    【讨论】:

    • 谢谢!这就是我要找的!
    • 有没有办法让滚动条在刷新时从顶部开始?我注意到的问题是 - Eid 2 有更多条目,当用户滚动到所有条目的底部,然后选择 eid1 时,滚动条会停在最后一个位置,而不是从顶部开始。因此,除非向上滚动,否则 eid 1 的条目对用户来说是空白的。有解决办法吗?
    • 要一直向上滚动,您需要调用画布的moveto 方法,有时还需要调用update_idletasks
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多