首页 > 解决方案 > 画布上的 Tkinter ttk.Scrollbar 滚动正常,但滚动条小部件显示不正确?

问题描述

这是我第一次在画布上放置滚动小部件,但我不确定我做错了什么。我觉得这可能是我从 for 循环插入到画布中的小部件的问题。

这是创建滚动条和画布的代码部分(我删除了一些不相关的代码行):

#Raise the Browse Frame
def BrowseFrame(): <--- I bound this to the button which raises the browse window

    global B_scrollableFrame
    global images

    for widget in B_scrollableFrame.winfo_children():
        widget.destroy()

    # CREATE BOOKS OPTIONS #
    #Connect to database
    conn=sqlite3.connect(db_file)
    cur=conn.cursor()

    cur.execute('''SELECT BookDetails.ISBN, BookDetails.Title, Authors.FirstName ||' '|| Authors.LastName, Genre.Genre
        From BookDetails
        INNER JOIN Genre ON BookDetails.Genre = Genre.ID
        INNER JOIN Authors ON BookDetails.Author = Authors.ID
        ORDER BY BookDetails.Title ASC
        ''')

    i=0
    Frames=[]
    buttons=[]
    images=[]
    labels=[]

    for row in cur:

        Frames.append(tk.Frame(B_scrollableFrame,width=560,height=150,bg='white',highlightbackground='black',highlightcolor='black',highlightthickness=1))
        Frames[-1].grid(row=i,column=0,padx=(38,0),pady=(30,0))
        Frames[-1].pack_propagate(False)

        try:
            B_img=tk.PhotoImage(file=row[1]+'.PNG')
            B_img=B_img.subsample(2,2)
            images.append(B_img)
            labels.append(tk.Label(Frames[-1],image=B_img).pack(side='left',fill=Y))

        except:
            B_img=tk.PhotoImage(file='NA.PNG')
            B_img=B_img.subsample(2,2)
            images.append(B_img)
            labels.append(tk.Label(Frames[-1],image=B_img).pack(side='left',fill=Y))

        tk.Label(Frames[-1],text=row[1],font=("Helvetica",24,"bold"),bg='white',wraplength=380).pack(fill=X,expand=TRUE)


        buttons.append(tk.Button(Frames[-1],text='\n',command=lambda txt=row[0] : ViewBook(txt),width=5,cursor='hand2'))
        buttons[-1].pack(side='right')


        tk.Label(Frames[-1],text='          '+row[2],font=("Helvetica",18,'italic'),bg='white').pack(side='left')
        tk.Label(Frames[-1],text='     '+row[3],font=("Helvetica",18),bg='white').pack(side='left')
        #print(i)

        i= i+1

    #print(Frames)
    conn.close()

    master.lift()
    BROWSE_FRAME.lift()


#Set up Page
BROWSE_FRAME=tk.Frame(master,borderwidth=1,width=661,height=431,bg=borderColour)
BROWSE_FRAME.grid(row=2,rowspan=12,column=0,pady=(6,0),padx=(0,4),sticky=E)
BROWSE_FRAME.pack_propagate(False)
BROWSE_FRAME.grid_propagate(False)

BROWSE_FRAME.grid_columnconfigure(0, weight=1)
BROWSE_FRAME.grid_columnconfigure(1, weight=1)

canvas=tk.Canvas(BROWSE_FRAME,height=375,width=635)
scrollbar=ttk.Scrollbar(BROWSE_FRAME, orient='vertical', command=canvas.yview)
B_scrollableFrame=tk.Frame(canvas)


B_scrollableFrame.bind(
    '<Configure>',
    lambda event, canvas=canvas:canvas.configure(
        scrollregion=canvas.bbox('all')
    )
)


canvas.create_window((0,0), window=B_scrollableFrame, anchor='nw')

canvas.grid(row=1,column=0,columnspan=5)
scrollbar.grid(row=1,column=6,sticky=NS)

scrollbar.config(command=canvas.yview)

使用我的完整代码,我得到的结果是一个可滚动的画布,但滚动条的“条”填充了整个滚动条小部件。问题是,我仍然可以通过单击并拖动栏来使用它来滚动。

这是一张图片: 带滚动条的画布

我不知道为什么会这样。从 for 循环插入小部件后,我已经尝试创建滚动条小部件,但结果仍然相同。

有人知道为什么会这样吗?无论如何我可以解决这个问题吗?

标签: pythonfor-loopcanvastkinterscrollbar

解决方案


您需要canvas["yscrollcommand"] = scrollbar.set在创建滚动条后使用。


推荐阅读