python - 画布上的 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 循环插入小部件后,我已经尝试创建滚动条小部件,但结果仍然相同。
有人知道为什么会这样吗?无论如何我可以解决这个问题吗?
解决方案
您需要canvas["yscrollcommand"] = scrollbar.set
在创建滚动条后使用。
推荐阅读
- assembly - 除以负小数并显示在消息框中
- angular - 如何使用容器名称而不是静态 IP 在 Angular 9 容器和 ASP.NET Core 3.1 容器之间建立通信?
- reactjs - Lottie 动画越过标题
- python - Python - 为 JSON 解码 PNG 图像
- python-3.x - 获取 Typerror:字符串格式化期间并非所有参数都转换
- node.js - 在 nodeJS 中使用 setTimeout
- python - 比较熊猫中不同大小的数据框并根据比较创建新列
- python - 在熊猫中使用没有爆炸功能的字符串值爆炸数据框
- php - 当我已经有关键字搜索时,将下拉菜单添加到高级搜索
- typescript - 通过微服务(通过 npm)共享 API TS 类型的正确方法是什么?