Tkinter:将标签扩展到列的边缘

时间:2015-08-01 18:16:44

标签: python tkinter

我想用Python和Tkinter建立一个三列表。为此,我将每个单元格作为画布和画布内的标签实现,因为我需要画布小部件的tags选项。

我想将每个单元格从左到右分布在列的整个宽度上(这样点击事件不仅可以记录在文本上,还可以记录在整行上)。但是,以下代码不会执行此操作:

文本居中但标签和画布仅包含文本,而不包括单元格的整个宽度。我尝试添加

sticky = Tkinter.N+Tkinter.S+Tkinter.E+Tkinter.W

在标签和/或画布上;但是,对于某些组合,文本左对齐,每个标签和画布仅包含文本而不是整个单元格,其他文本粘性属性文本再次居中,但标签和画布仍然很窄。

这是我的代码:

import Tkinter

class Application(Tkinter.Frame):

    def __init__(self, master=None):
        Tkinter.Frame.__init__(self, master)
        self.master.geometry("800x600")
        self.grid()

        list = [[1, 2, 3], [4, 5, 6], [7777, 8888, 9999]]

        self.cells_canvas = []
        self.cells_label = []
        i = 0

        for entry in list:
            self.cells_canvas.append([Tkinter.Canvas(self), Tkinter.Canvas(self), Tkinter.Canvas(self)])
            self.cells_label.append([None, None, None])

            self.cells_label[i][0] = Tkinter.Label(self.cells_canvas[i][0])
            self.cells_label[i][0]["text"] = entry[0]
            self.cells_label[i][0].config(bg = "#A00")
            self.cells_label[i][0].grid(row = 0, column = 0, columnspan = 1) # reference A
            self.cells_canvas[i][0].grid(row = i, column = 0, columnspan = 1) # reference B

            self.cells_label[i][1] = Tkinter.Label(self.cells_canvas[i][1])
            self.cells_label[i][1]["text"] = entry[1]
            self.cells_label[i][1].grid(row = 0, column = 0, columnspan = 1)
            self.cells_canvas[i][1].grid(row = i, column = 1, columnspan = 1)

            self.cells_label[i][2] = Tkinter.Label(self.cells_canvas[i][2])
            self.cells_label[i][2]["text"] = entry[2]
            self.cells_label[i][2].grid(row = 0, column = 0, columnspan = 1)
            self.cells_canvas[i][2].grid(row = i, column = 2, columnspan = 1)

            i = i+1

root = Tkinter.Tk()
app = Application()
app.mainloop()

使用此代码,只有第0列中的文本而不是整列显示红色背景。 在引用A处添加sticky = Tkinter.N + Tkinter.S + Tkinter.E + Tkinter.W时没有任何变化。 在代码B处添加该文本时,文本显示为左对齐。同样,只有文本有红色beackground。 使用引用A和B的代码,相同。

1 个答案:

答案 0 :(得分:1)

使用grid时,sticky选项确实是如何获得标签来填充其单元格的。标签小部件有一个anchor选项,用于控制文本在标签中的显示位置。

此外,您必须确保在给定父级中,列扩展以填充父级中的任何额外空间。在您的情况下,画布中的第0列仅与其内容一样宽,因此它不会填充画布的整个宽度。

您需要为每个画布中的第0列赋予正重量,以便该列将展开以填充给定的空间。

self.cells_canvas[i][0].columnconfigure(0, weight=1)
self.cells_canvas[i][1].columnconfigure(1, weight=1)
self.cells_canvas[i][2].columnconfigure(2, weight=1)

你可能想要对每一行做类似的事情。使用画布时,一个非常好的经验法则是始终确保至少一行和至少一列具有正重量。

如果每个画布中只有一个小部件,pack可能是更好的选择,因为您不必担心颜色和行。