在画布上放置标签

2024-09-27 22:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个可滚动的表和下面的界面看起来几乎像我想要的。但仍然让我不安的是,我必须传入一个参数列宽。我宁愿把画布分成等距的几列。确定宽度的需要是多余的。你知道吗

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()

Tags: columnsselfifcolumnwidthframelabeltk
1条回答
网友
1楼 · 发布于 2024-09-27 22:30:51

使用create_window方法将标签添加到画布时,可以指定标签的宽度。只需将画布宽度除以列数,然后使用该值设置每列的宽度。你知道吗

例如,您的initialize_table方法有以下更改:

  • 我删除了column_width参数,并用一个计算来替换它。你知道吗
  • 我在创建标签时删除了width参数
  • 我在调用create_window时添加了width参数
  • 在调用create_window之后,我移动了column_cor的计算 第一个单元格在左边
  • 我使用anchor选项来create_window,这样单元格就开始了 在画布的左上角。你知道吗

def initialize_table(self, rows, columns):

    column_width = int(self.canvas.winfo_reqwidth()/columns)
    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')
            row_cor = row_cor  if i != 0 else label.winfo_reqheight() / 2
            self.canvas.create_window(column_cor, row_cor, window=label, width=column_width, anchor="nw")
            column_cor = column_cor + column_width

    self.canvas.configure(scrollregion=(0, 0, 0, label.winfo_reqheight()*rows))

相关问题 更多 >

    热门问题