Python Tkinter小部件上的垂直和水平滚动条

Python Tkinter小部件上的垂直和水平滚动条,python,tkinter,scrollbar,tkinter-canvas,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=BO

我试图将数据库的内容输出到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'))

我只需要让水平和垂直滚动同时工作,或者找到替代解决方案。

我没有看到任何代码会阻止滚动条工作。我确实看到了一个问题,它阻止其中一个滚动条显示在您期望的位置(假设您期望它们出现在传统位置)。这就是你说你希望他们“同时工作”的意思吗

使用以下代码并按照以下顺序完成布局:

self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE)
self.xscrollbar.pack(side=BOTTOM, fill=X)
self.yscrollbar.pack(side=RIGHT, fill=Y)
第一行导致画布填充小部件的整个顶部,从左到右。当您稍后将yscrollbar放置在右侧时,这意味着在画布填满顶部后,它将转到剩余空间的右侧。由于画布填充顶部,因此右侧没有剩余空间,只有下方。因此,滚动条将显示为画布下方水平滚动条高度的小部件

一个快速修复方法是先打包垂直滚动条,然后打包水平滚动条,然后打包画布。您的“主要”小部件应该始终是您打包/网格的最后一件东西之一。首先,你这样做的原因很明显,在这种情况下,你需要得到想要的效果,但也因为它使你的调整大小的行为正确。我不想在这个答案中解释原因,所以请阅读以了解更多信息

第二,当使用滚动条时,如果您想要专业的外观,最好使用网格。如果使用pack,滚动条将不会在其相交的角落中对齐属性。您希望它们看起来像这样,在右下角有一个小空格:

  ||
==
但是,如果您使用pack,它们将看起来像:

   ||    -or-      ||
 ====            ==||
最后,我建议您不要
导入*
,否则可能会导致问题。相反,要养成这样的习惯:将Tkinter导入为tk,然后在所有tk命令前面加上“tk”(例如:
tk.Canvas
,等等)。当您第一次尝试在同一UI中混合ttk和tkinter小部件时,您就会明白为什么这一点很重要,但是如果您也从其他软件包“导入*”,您可能会在其他地方遇到问题。另外,当您使用tk特性和其他软件包中的特性时,这种方式很明显

从教程中可以看出,导入的效果与预期的一样(应该针对Python2.x修改导入)。
   ||    -or-      ||
 ====            ==||