我想用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的代码,相同。
答案 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
可能是更好的选择,因为您不必担心颜色和行。