我想创建一个可滚动的表和下面的界面看起来几乎像我想要的。但仍然让我不安的是,我必须传入一个参数列宽。我宁愿把画布分成等距的几列。确定宽度的需要是多余的。你知道吗
import tkinter as tk
class ScrollableTable:
def __init__(self, frame, rows, columns, column_width):
self.frame = frame
self.canvas = tk.Canvas(self.frame, width= self.frame.winfo_reqwidth(), height=frame.winfo_reqheight())
# self.canvas.configure(scrollregion=(0, 0, 0, 100000))
self.canvas.grid(row=0, column=0)
self.vbar = tk.Scrollbar(self.frame, orient='vertical', command=self.canvas.yview)
self.vbar.grid(row=0, column=1, sticky='ns')
self.canvas.config(yscrollcommand=self.vbar.set)
self.initialize_table(rows, columns, column_width)
def initialize_table(self, rows, columns, column_width):
for i in range(rows):
column_cor = 0
row_cor = row_cor + label.winfo_reqheight() if i != 0 else 0
for j in range(columns):
label = tk.Label(self.canvas, relief = 'solid', width = column_width)
column_cor = column_cor + label.winfo_reqwidth() if j != 0 else label.winfo_reqwidth() / 2
row_cor = row_cor if i != 0 else label.winfo_reqheight() / 2
self.canvas.create_window(column_cor, row_cor, window=label)
self.canvas.configure(scrollregion=(0, 0, 0, label.winfo_reqheight()*rows))
if __name__ == '__main__':
root = tk.Tk()
frame = tk.Frame(root, width = 600, height = 400, relief = 'solid')
frame.grid(column = 0, row = 0)
ScrollableTable(frame, rows = 100, columns = 4, column_width = 20)
root.mainloop()
使用
create_window
方法将标签添加到画布时,可以指定标签的宽度。只需将画布宽度除以列数,然后使用该值设置每列的宽度。你知道吗例如,您的
initialize_table
方法有以下更改:column_width
参数,并用一个计算来替换它。你知道吗width
参数create_window
时添加了width
参数create_window
之后,我移动了column_cor
的计算 第一个单元格在左边anchor
选项来create_window
,这样单元格就开始了 在画布的左上角。你知道吗相关问题 更多 >
编程相关推荐