【发布时间】: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
-
你是对的。我相应地更改了代码。