【问题标题】:Tkinter: Extend labels to the edge of the columnTkinter:将标签扩展到列的边缘
【发布时间】:2015-10-24 05:32:20
【问题描述】:

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

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

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

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 中添加它后,文本显示为左对齐。同样,只有文本有红色背景。 使用引用 A 和 B 处的代码,相同。

【问题讨论】:

  • 因为您的表格似乎是只读的(使用标签而不是条目),您是否有任何理由不能使用多个一起滚动的列表框?
  • 请创建一个MCVE
  • 你是对的。我相应地更改了代码。

标签: python tkinter


【解决方案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 可能是更好的选择,因为您不必担心颜色和行数。

【讨论】:

  • 标签本身粘在画布的左侧(在画布覆盖整个列的情况下)并保持窄 - 即使我添加了粘性属性。我可以通过添加背景 (self.cells_label[i][1].config(bg="#A00")) 使其可见。标签的背景仅与文本一样宽。
  • @MichaelWestwort:我已经更新了我的答案。简短的回答是,标签 is 扩展以填充其列。但是,该列没有扩展以填充其父级。
  • 感谢您的回答。顺便说一句,即使没有粘性,Entry 而不是 Label 也是正确的。
  • @MichaelWestwort:不,条目与标签没有什么不同。看起来它似乎在工作,但这只是因为它们默认为相似的大小,因此列中的所有小部件都将具有相同的宽度并且看起来可以填充。如果您更改一些导致列更宽的其他参数,您将看到完全相同的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 2011-10-18
  • 2020-06-15
相关资源
最近更新 更多