如何在填充整个单元格时左对齐 Python tkinter 网格列
How to left justify Python tkinter grid columns while filling entire cell
我正在尝试编写 python class 以表格格式显示数据。我确信已经有 classes 在那里做同样的事情,但是,我正在使用这个练习作为自学 Python 和 tkinter 的一种方式。在大多数情况下,我让 class 以我想要的方式工作,但是我无法让 header 和数据单元格填充整个单元格,同时左对齐。这是我的 class 当前为 table:
生成的内容
我继续将单元格上的粘性更改为 (W,E) 而不仅仅是 W,以显示我希望 table 的外观,除了每个单元格左对齐。以下是我要拍摄的内容:
根据我所做的研究,我似乎需要使用 grid_columnconfigure
和 grid_rowconfigure
的 weight
属性,但是我尝试过使用它们的每一种方式我不能,让它工作。
这是我的 class 的代码(我使用的是 Python 3.4):
from tkinter import *
from tkinter import ttk
from tkinter import font
class TableData:
def __init__(self,parent,attributes,columns,data):
self.parent = parent
self.tableName = StringVar()
self.tableName.set(attributes['tableName'])
self.columns = columns
self.columnCount = 0
self.borderColor = attributes['borderColor']
self.titleBG = attributes['titleBG']
self.titleFG = attributes['titleFG']
self.titleFontSize = attributes['titleFontSize']
self.headerBG = attributes['headerBG']
self.headerFG = attributes['headerFG']
self.headerFontSize = attributes['headerFontSize']
self.dataRowColor1 = attributes['dataRowColor1']
self.dataRowColor2 = attributes['dataRowColor2']
self.dataRowFontSize = attributes['dataRowFontSize']
self.dataRowFG = attributes['dataRowFG']
self.data = data
self.tableDataFrame = ttk.Frame(self.parent)
self.tableDataFrame.grid(row=0,column=0)
self.initUI()
def countColumns(self):
cnt = 0
for i in self.columns:
cnt += 1
self.columnCount = cnt
def buildTableTitle(self):
tableTitleFont = font.Font(size=self.titleFontSize)
Label(self.tableDataFrame,textvariable=self.tableName,bg=self.titleBG,fg=self.titleFG,font=tableTitleFont, highlightbackground=self.borderColor,highlightthickness=2).grid(row=0,columnspan=self.columnCount,sticky=(W,E), ipady=3)
def buildHeaderRow(self):
colCount = 0
tableHeaderFont = font.Font(size=self.headerFontSize)
for col in self.columns:
Label(self.tableDataFrame,text=col,font=tableHeaderFont,bg=self.headerBG,fg=self.headerFG,highlightbackground=self.borderColor,highlightthickness=1).grid(row=1,column=colCount,sticky=W, ipady=2, ipadx=5)
colCount += 1
def buildDataRow(self):
tableDataFont = font.Font(size=self.dataRowFontSize)
rowCount = 2
for row in self.data:
if rowCount % 2 == 0:
rowColor = self.dataRowColor2
else:
rowColor = self.dataRowColor1
colCount = 0
for col in row:
Label(self.tableDataFrame,text=col,bg=rowColor,fg=self.dataRowFG,font=tableDataFont,highlightbackground=self.borderColor,highlightthickness=1).grid(row=rowCount,column=colCount,sticky=W,ipady=1, ipadx=5)
colCount += 1
rowCount += 1
def initUI(self):
self.countColumns()
self.buildTableTitle()
self.buildHeaderRow()
self.buildDataRow()
这是一个引用 TableData 的测试文件 class:
from tkinter import *
from tkinter import ttk
from tableData import TableData
import sqlite3
root = Tk()
root.geometry('1000x400')
mainframe = ttk.Frame(root).grid(row=0,column=0)
attributes = {}
attributes['tableName'] = 'Title'
attributes['borderColor'] = 'black'
attributes['titleBG'] = '#1975D1'
attributes['titleFG'] = 'white'
attributes['titleFontSize'] = 16
attributes['headerBG'] = 'white'
attributes['headerFG'] = 'black'
attributes['headerFontSize'] = 12
attributes['dataRowColor1'] = 'white'
attributes['dataRowColor2'] = 'grey'
attributes['dataRowFontSize'] = 10
attributes['dataRowFG'] = 'black'
columns = ['Col 1', 'Column 2', 'Column 3','Column 4']
results = [('1','Key','Desc','Attribute'),('2','Key Column','Description Column','AttributeColumn')]
table = TableData(mainframe,attributes,columns,results)
root.mainloop()
提前感谢您的任何见解。如果有任何其他有用的信息,请告诉我。
网格化时尝试设置columnspan
属性:
self.tableDataFrame.grid(row=0, column=0, columnspan=2)
2 可能不是正确的尺寸,请尝试直到得到您想要的尺寸。
如果您希望标签中的文本左对齐,请使用锚点选项。它采用表示罗盘上的点的字符串(例如:"w" = "west",表示文本锚定在左侧):
for col in row:
Label(..., anchor="w").grid(...)
对于任何几何网格,添加选项 sticky="W"
,例如
self.tableDataFrame.grid(sticky="W", row=0, column=0)
您没有定义标签的宽度,因此 tkinter 将标签的宽度设置为等于文本的宽度。这就是为什么您的标签不会占据单元格的整个宽度。要使它们占据所有可用宽度,请使用 stickkey = E+W
Label(self.tableDataFrame,text=col,font=tableHeaderFont,bg=self.headerBG,fg=self.headerFG,highlightbackground=self.borderColor,highlightthickness=1).grid(row=1,column=colCount,sticky=W+E, ipady=2, ipadx=5)
我正在尝试编写 python class 以表格格式显示数据。我确信已经有 classes 在那里做同样的事情,但是,我正在使用这个练习作为自学 Python 和 tkinter 的一种方式。在大多数情况下,我让 class 以我想要的方式工作,但是我无法让 header 和数据单元格填充整个单元格,同时左对齐。这是我的 class 当前为 table:
生成的内容我继续将单元格上的粘性更改为 (W,E) 而不仅仅是 W,以显示我希望 table 的外观,除了每个单元格左对齐。以下是我要拍摄的内容:
根据我所做的研究,我似乎需要使用 grid_columnconfigure
和 grid_rowconfigure
的 weight
属性,但是我尝试过使用它们的每一种方式我不能,让它工作。
这是我的 class 的代码(我使用的是 Python 3.4):
from tkinter import *
from tkinter import ttk
from tkinter import font
class TableData:
def __init__(self,parent,attributes,columns,data):
self.parent = parent
self.tableName = StringVar()
self.tableName.set(attributes['tableName'])
self.columns = columns
self.columnCount = 0
self.borderColor = attributes['borderColor']
self.titleBG = attributes['titleBG']
self.titleFG = attributes['titleFG']
self.titleFontSize = attributes['titleFontSize']
self.headerBG = attributes['headerBG']
self.headerFG = attributes['headerFG']
self.headerFontSize = attributes['headerFontSize']
self.dataRowColor1 = attributes['dataRowColor1']
self.dataRowColor2 = attributes['dataRowColor2']
self.dataRowFontSize = attributes['dataRowFontSize']
self.dataRowFG = attributes['dataRowFG']
self.data = data
self.tableDataFrame = ttk.Frame(self.parent)
self.tableDataFrame.grid(row=0,column=0)
self.initUI()
def countColumns(self):
cnt = 0
for i in self.columns:
cnt += 1
self.columnCount = cnt
def buildTableTitle(self):
tableTitleFont = font.Font(size=self.titleFontSize)
Label(self.tableDataFrame,textvariable=self.tableName,bg=self.titleBG,fg=self.titleFG,font=tableTitleFont, highlightbackground=self.borderColor,highlightthickness=2).grid(row=0,columnspan=self.columnCount,sticky=(W,E), ipady=3)
def buildHeaderRow(self):
colCount = 0
tableHeaderFont = font.Font(size=self.headerFontSize)
for col in self.columns:
Label(self.tableDataFrame,text=col,font=tableHeaderFont,bg=self.headerBG,fg=self.headerFG,highlightbackground=self.borderColor,highlightthickness=1).grid(row=1,column=colCount,sticky=W, ipady=2, ipadx=5)
colCount += 1
def buildDataRow(self):
tableDataFont = font.Font(size=self.dataRowFontSize)
rowCount = 2
for row in self.data:
if rowCount % 2 == 0:
rowColor = self.dataRowColor2
else:
rowColor = self.dataRowColor1
colCount = 0
for col in row:
Label(self.tableDataFrame,text=col,bg=rowColor,fg=self.dataRowFG,font=tableDataFont,highlightbackground=self.borderColor,highlightthickness=1).grid(row=rowCount,column=colCount,sticky=W,ipady=1, ipadx=5)
colCount += 1
rowCount += 1
def initUI(self):
self.countColumns()
self.buildTableTitle()
self.buildHeaderRow()
self.buildDataRow()
这是一个引用 TableData 的测试文件 class:
from tkinter import *
from tkinter import ttk
from tableData import TableData
import sqlite3
root = Tk()
root.geometry('1000x400')
mainframe = ttk.Frame(root).grid(row=0,column=0)
attributes = {}
attributes['tableName'] = 'Title'
attributes['borderColor'] = 'black'
attributes['titleBG'] = '#1975D1'
attributes['titleFG'] = 'white'
attributes['titleFontSize'] = 16
attributes['headerBG'] = 'white'
attributes['headerFG'] = 'black'
attributes['headerFontSize'] = 12
attributes['dataRowColor1'] = 'white'
attributes['dataRowColor2'] = 'grey'
attributes['dataRowFontSize'] = 10
attributes['dataRowFG'] = 'black'
columns = ['Col 1', 'Column 2', 'Column 3','Column 4']
results = [('1','Key','Desc','Attribute'),('2','Key Column','Description Column','AttributeColumn')]
table = TableData(mainframe,attributes,columns,results)
root.mainloop()
提前感谢您的任何见解。如果有任何其他有用的信息,请告诉我。
网格化时尝试设置columnspan
属性:
self.tableDataFrame.grid(row=0, column=0, columnspan=2)
2 可能不是正确的尺寸,请尝试直到得到您想要的尺寸。
如果您希望标签中的文本左对齐,请使用锚点选项。它采用表示罗盘上的点的字符串(例如:"w" = "west",表示文本锚定在左侧):
for col in row:
Label(..., anchor="w").grid(...)
对于任何几何网格,添加选项 sticky="W"
,例如
self.tableDataFrame.grid(sticky="W", row=0, column=0)
您没有定义标签的宽度,因此 tkinter 将标签的宽度设置为等于文本的宽度。这就是为什么您的标签不会占据单元格的整个宽度。要使它们占据所有可用宽度,请使用 stickkey = E+W
Label(self.tableDataFrame,text=col,font=tableHeaderFont,bg=self.headerBG,fg=self.headerFG,highlightbackground=self.borderColor,highlightthickness=1).grid(row=1,column=colCount,sticky=W+E, ipady=2, ipadx=5)