我正在python3 / tkinter中编写一个小GUI。我想要做的是生成一个带有数据表的窗口(如电子表格),并使表格可以水平和垂直滚动。现在我只是想显示数据,所以我使用的是标签网格。数据显示工作正常,但我无法让滚动条正常工作。这是我的代码的相关部分;这个类继承自tk.Toplevel
frame = self.frame = tk.Frame(self)
self.frame.grid(row=1, columnspan=2, padx=2, pady=2, sticky=tk.N+tk.E+tk.S+tk.W)
self.text_area = tk.Canvas(self.frame, background="black", width=400, height=500, scrollregion=(0,0,1200,800))
self.hscroll = tk.Scrollbar(self.frame, orient=tk.HORIZONTAL, command=self.text_area.xview)
self.vscroll = tk.Scrollbar(self.frame, orient=tk.VERTICAL, command=self.text_area.yview)
self.text_area['xscrollcommand'] = self.hscroll.set
self.text_area['yscrollcommand'] = self.vscroll.set
self.text_area.grid(row=0, column=0, sticky=tk.N+tk.S+tk.E+tk.W)
self.hscroll.grid(row=1, column=0, sticky=tk.E+tk.W)
self.vscroll.grid(row=0, column=1, sticky=tk.N+tk.S)
self._widgets = []
for row in range(rows):
current_row = []
for column in range(columns):
label = tk.Label(self.text_area, text="",
borderwidth=0, width=width)
label.grid(row=row, column=column, sticky="nsew", padx=1, pady=1)
current_row.append(label)
self._widgets.append(current_row)
表格显示OK,滚动条显示但不起作用:
有什么想法吗?
答案 0 :(得分:2)
你有几个问题。首先,您不能使用grid
在画布中放置标签并期望它们滚动。滚动画布时,只有添加了create_window
的小部件才会滚动。但是,您可以使用网格将标签放在框架中,然后使用create_window
将框架添加到画布。这个网站上有几个这种技术的例子。
其次,您需要告诉画布画布中的多少数据应该是可滚动的。您可以通过设置画布的scrollregion
属性来使用它。有一个方法bbox
可以为您提供画布中所有数据的边界框。通常它是这样使用的:
canvas.configure(scrollregion=canvas.bbox("all"))
答案 1 :(得分:0)
我使用的一个选项是使标签保持静态,并在使用滚动条时更改数据。这对于垂直滚动很容易,但是如果列的宽度不同,则对于水平滚动不起作用-这将需要调整标签的大小。