微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 For 循环中创建的 Tkinter 可滚动帧无法正确显示

如何解决在 For 循环中创建的 Tkinter 可滚动帧无法正确显示

我想在另一个“可滚动框架”中创建多个“可滚动框架”。

我所说的“可滚动框架”是我从 Codemy.com 获取的一些小技巧:https://youtu.be/0WafQCaok6g

当我像下面的代码一样一一创建它们时,一切正常。

from tkinter import *
from tkinter import ttk

window = Tk()
window.attributes('-zoomed',True)
screen_width = window.winfo_screenwidth()

main_frame = Frame(window)
main_frame.pack(fill=BOTH,expand=YES)

my_main_canvas = Canvas(main_frame)
my_main_canvas.pack(side=LEFT,fill=BOTH,expand=YES)
my_main_scrollbar = ttk.Scrollbar(main_frame,orient=VERTICAL,command=my_main_canvas.yview)
my_main_scrollbar.pack(side=RIGHT,fill=Y)
my_main_canvas.configure(yscrollcommand=my_main_scrollbar.set)
my_main_canvas.bind('<Configure>',lambda e: my_main_canvas.configure(scrollregion = my_main_canvas.bBox("all")))
new_main_frame = Frame(my_main_canvas,relief=SUNKEN)
my_main_canvas.create_window((0,0),window=new_main_frame,anchor="center",width=screen_width-30)




frame1 = Frame(new_main_frame)
frame1.pack(fill=X,pady=10)
my_canvas1 = Canvas(frame1)
my_canvas1.pack(side=TOP,expand=YES)
my_scrollbar1 = ttk.Scrollbar(frame1,orient=HORIZONTAL,command=my_canvas1.xview)
my_scrollbar1.pack(side=BottOM,fill=X)
my_canvas1.configure(xscrollcommand=my_scrollbar1.set)
my_canvas1.bind('<Configure>',lambda e: my_canvas1.configure(scrollregion = my_canvas1.bBox("all")))
second_frame1 = Frame(my_canvas1,relief=SUNKEN)
my_canvas1.create_window((0,window=second_frame1,anchor="center")
for i in range (100):
    Label(second_frame1,text=f"Label {i+1}").grid(row=0,column=i)


frame2 = Frame(new_main_frame)
frame2.pack(fill=X,pady=10)
my_canvas2 = Canvas(frame2)
my_canvas2.pack(side=TOP,expand=YES)
my_scrollbar2 = ttk.Scrollbar(frame2,command=my_canvas2.xview)
my_scrollbar2.pack(side=BottOM,fill=X)
my_canvas2.configure(xscrollcommand=my_scrollbar2.set)
my_canvas2.bind('<Configure>',lambda e: my_canvas2.configure(scrollregion = my_canvas2.bBox("all")))
second_frame2 = Frame(my_canvas2,relief=SUNKEN)
my_canvas2.create_window((0,window=second_frame2,anchor="center")
for i in range (100):
    Label(second_frame2,column=i)


frame3 = Frame(new_main_frame)
frame3.pack(fill=X,pady=10)
my_canvas3 = Canvas(frame3)
my_canvas3.pack(side=TOP,expand=YES)
my_scrollbar3 = ttk.Scrollbar(frame3,command=my_canvas3.xview)
my_scrollbar3.pack(side=BottOM,fill=X)
my_canvas3.configure(xscrollcommand=my_scrollbar3.set)
my_canvas3.bind('<Configure>',lambda e: my_canvas3.configure(scrollregion = my_canvas3.bBox("all")))
second_frame3 = Frame(my_canvas3,relief=SUNKEN)
my_canvas3.create_window((0,window=second_frame3,anchor="center")
for i in range (100):
    Label(second_frame3,column=i)


window.mainloop()

我的问题来了。我事先不知道我将使用多少个可滚动框架。因此,我使用 for 循环来创建它们(下面的代码)。但是,可滚动框架无法正确显示内容(最后一个除外)。

from tkinter import *
from tkinter import ttk

window = Tk()
window.attributes('-zoomed',width=screen_width-30)




for i in range(3):
    frame = Frame(new_main_frame)
    frame.pack(fill=X,pady=10)
    my_canvas = Canvas(frame)
    my_canvas.pack(side=TOP,expand=YES)
    my_scrollbar = ttk.Scrollbar(frame,command=my_canvas.xview)
    my_scrollbar.pack(side=BottOM,fill=X)
    my_canvas.configure(xscrollcommand=my_scrollbar.set)
    my_canvas.bind('<Configure>',lambda e: my_canvas.configure(scrollregion = my_canvas.bBox("all")))
    second_frame = Frame(my_canvas,relief=SUNKEN)
    my_canvas.create_window((0,window=second_frame,anchor="center")
    for i in range (100):
        Label(second_frame,column=i)
    

window.mainloop()

抱歉没有向您展示屏幕截图,但 Stack Overflow 暂时不允许我在问题中嵌入图片

如果你愿意帮助我并想看看问题是什么,我直接邀请你 在您的计算机上运行代码

对于 Windows 用户,将 window.attributes('-zoomed',True) 替换为 window.state("zoomed")

我认为问题出在 for 循环的每次迭代中使用相同的变量名,所以我尝试用字典列表以不同的方式存储它们,但它也不起作用。

感谢您的帮助

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。