我发现了一段代码,尝试对其进行修改以显示一个值表格。我的问题是标题覆盖了其中一行,我似乎无法解决它。我有一个包含类实例作为值的字典,每个类实例都获取自己的行。在本例中,字典中有 5 个值,但窗口却显示 4 行加上一行标题。我基本上希望第 0 行是我的标题行, 第 1 行对应项目 0 第 2 行对应项目 1 … 第 5 行对应项目 4 鉴于当我尝试添加额外行时出现 IndexError:列表索引超出范围,是否可行?
解决方法:
要解决此问题,首先需要在 SimpleTable 类的构造函数中创建一个额外的行。这可以通过在 for 循环之前添加以下行来实现:
current_row = []
接下来,需要将所有汽车的数据向下移动一行。这可以通过在 for 循环中将 row 变量递增 1 来实现。
for row in range(1, rows+1):
最后,需要将标题添加到新创建的第 0 行。这可以通过在 for 循环之前添加以下行来实现:
t.set(0,0,"Make")
t.set(0,1,"Model")
t.set(0,2,"Km/l")
t.set(0,3,"Passengers")
t.set(0,4,"Doors")
t.set(0,5,"Reg")
t.set(0,6,"Daily Cost")
t.set(0,7,"Weekly Cost")
t.set(0,8,"Weekend Cost")
由此,问题即可解决。
代码示例:
class DC(Tk): #display cars
def __init__(self):
Tk.__init__(self)
t = SimpleTable(self, len(cars),8)
t.pack(side="top", fill="x")
t.set(0,0,"Make")
t.set(0,1,"Model")
t.set(0,2,"Km/l")
t.set(0,3,"Passengers")
t.set(0,4,"Doors")
t.set(0,5,"Reg")
t.set(0,6,"Daily Cost")
t.set(0,7,"Weekly Cost")
t.set(0,8,"Weekend Cost")
class SimpleTable(Frame):
def __init__(self, parent, rows, columns):
reg_list=cars.keys()
Frame.__init__(self, parent, background="black")
self._widgets = []
current_row = []
t.set(0,0,"Make")
t.set(0,1,"Model")
t.set(0,2,"Km/l")
t.set(0,3,"Passengers")
t.set(0,4,"Doors")
t.set(0,5,"Reg")
t.set(0,6,"Daily Cost")
t.set(0,7,"Weekly Cost")
t.set(0,8,"Weekend Cost")
for row in range(1,rows+1): #amended to start at row 1
current_row = []
current_reg=reg_list[row-1]
make = Label(self, text=cars[current_reg].make,borderwidth=0, width=10)
make.grid(row=row, column=0, sticky="nsew", padx=1, pady=1)
current_row.append(make)
model = Label(self, text=cars[current_reg].model,borderwidth=0, width=10)
model.grid(row=row, column=1, sticky="nsew", padx=1, pady=1)
current_row.append(model)
kml = Label(self, text=cars[current_reg].kml,borderwidth=0, width=10)
kml.grid(row=row, column=2, sticky="nsew", padx=1, pady=1)
current_row.append(kml)
passengers = Label(self, text=cars[current_reg].passengers,borderwidth=0, width=10)
passengers.grid(row=row, column=3, sticky="nsew", padx=1, pady=1)
current_row.append(passengers)
doors = Label(self, text=cars[current_reg].doors,borderwidth=0, width=10)
doors.grid(row=row, column=4, sticky="nsew", padx=1, pady=1)
current_row.append(doors)
reg = Label(self, text=cars[current_reg].reg,borderwidth=0, width=10)
reg.grid(row=row, column=5, sticky="nsew", padx=1, pady=1)
current_row.append(reg)
daily = Label(self, text=cars[current_reg].daily_cost,borderwidth=0, width=10)
daily.grid(row=row, column=6, sticky="nsew", padx=1, pady=1)
current_row.append(daily)
weekly = Label(self, text=cars[current_reg].weekly_cost,borderwidth=0, width=10)
weekly.grid(row=row, column=7, sticky="nsew", padx=1, pady=1)
current_row.append(weekly)
weekend = Label(self, text=cars[current_reg].weekend_cost,borderwidth=0, width=10)
weekend.grid(row=row, column=8, sticky="nsew", padx=1, pady=1)
current_row.append(weekend)
self._widgets.append(current_row)
for column in range(columns):
self.grid_columnconfigure(column, weight=1)
def set(self, row, column, value):
widget = self._widgets[row][column]
widget.configure(text=value)