laj*_*jay 8 python tkinter scrollbar tkinter-canvas
我试图将数据库的内容输出到Tkinter小部件.数据库有足够的行和列,我需要启用水平和垂直滚动条,但我很难获得水平和垂直滚动同时工作.我不知道使用了哪个Tkinter小部件,但这是我当前的实现:
# Create root
self.root = Tk()
self.root.geometry('1000x500+0+0')
# Create canvas
self.canvas = Canvas(self.root)
self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE)
# Create scrollbars
self.xscrollbar = Scrollbar(self.root, orient=HORIZONTAL, command=self.canvas.xview)
self.xscrollbar.pack(side=BOTTOM, fill=X)
self.yscrollbar = Scrollbar(self.root, orient=VERTICAL, command=self.canvas.yview)
self.yscrollbar.pack(side=RIGHT, fill=Y)
# Attach canvas to scrollbars
self.canvas.configure(xscrollcommand=self.xscrollbar.set)
self.canvas.configure(yscrollcommand=self.yscrollbar.set)
# Create frame inside canvas
self.frame = Frame(self.canvas)
self.canvas.create_window((0,0), window=self.frame, anchor=NW)
self.frame.bind('<Configure>', self.set_scrollregion)
# Write db contents to canvas
self.print_dbcontents()
# Invoke main loop
self.root.mainloop()
def set_scrollregion(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox('all'))
Run Code Online (Sandbox Code Playgroud)
在这个实现中,我只能在一个方向上滚动,这取决于我如何打包画布:
self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE) # scrolling works in x but not y
self.canvas.pack(side=LEFT, fill=BOTH, expand=TRUE) # scrolling works in y but not x
Run Code Online (Sandbox Code Playgroud)
我只需要水平和垂直滚动同时工作,或找到替代解决方案.
Bry*_*ley 10
我没有看到任何会阻止滚动条工作的代码.我确实看到一个问题,阻止其中一个滚动条显示在您期望的位置(假设您希望它们出现在传统的位置).这就是你的意思,你说你希望他们"同时工作"吗?
您的布局使用以下代码完成,顺序如下:
self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE)
self.xscrollbar.pack(side=BOTTOM, fill=X)
self.yscrollbar.pack(side=RIGHT, fill=Y)
Run Code Online (Sandbox Code Playgroud)
第一行导致画布填充小部件的整个顶部,从左到右一直到最右边.当您稍后将yscrollbar放在右侧时,这意味着在画布填满顶部后,它会移到剩余空间的右侧.由于帆布填充顶部,右侧没有留下空间,仅在下方.因此,您的滚动条将显示为关于画布下方水平滚动条高度的小部件.
快速解决方法是首先打包垂直滚动条,然后打包水平,然后打包画布.您的"主要"小部件应始终是您打包/网格的最后一件事.一,你这样做的原因很明显,你需要在这种情况下获得所需的效果,还因为它使你的调整行为正确.我在主题中解释为什么在这个答案中,所以请阅读stackoverflow上的这个答案以获取更多信息.
其次,当使用滚动条时,如果你想要专业的外观,最好使用网格.如果使用pack,滚动条将不会在它们遇到的角落中对齐属性.你希望它们看起来像这样,右下角有一个小空格:
||
==
Run Code Online (Sandbox Code Playgroud)
但是,如果你使用包,他们将看起来像这样之一:
|| -or- ||
==== ==||
Run Code Online (Sandbox Code Playgroud)
最后,我鼓励你不要 import *,它可能会导致问题.相反,养成做import Tkinter as tk"tk"的所有tk命令前缀的习惯.(例如:tk.Canvas等).你会在第一次尝试在同一个用户界面中混合ttk和tkinter小部件时看到为什么这很重要,但如果你也从其他软件包中"导入*",你可能会遇到其他问题.此外,这种方式很明显,当您使用tk功能时,以及当您使用其他软件包中的功能时.