Как изменить цвета определенных строк и столбцов в таблице?

#python #list #tkinter #colors

Вопрос:

Я работал над проектом, в котором я намерен использовать tkinter для создания окна с таблицей, содержащей все мои результаты. Для этого у меня есть следующий код. Код работает просто отлично, но проблема в том, что мне нужно приписать некоторые цвета определенным строкам и столбцам, в то время как в текущем коде все заканчивается синим цветом. Допустим, например, мне нужно, чтобы первые 3 строки столбца 1 были выделены красным цветом. Есть какие-нибудь идеи о том, как это можно сделать? Большое вам спасибо за любую помощь.

 # Create a table for tkinter

class Table:

def __init__(self, root):

    # code for creating table
    for i in range(total_rows):
        for j in range(total_columns):
            self.e = Entry(root, width=20, fg='blue',
                           font=('Arial', 16, 'bold'))
            self.e.grid(row=i, column=j)
            self.e.insert(END, lst[i][j])


# take the data
lst = [(1, 'Raj', 'Mumbai', 19),
       (2, 'Aaryan', 'Pune', 18),
       (3, 'Vaishnavi', 'Mumbai', 20),
       (4, 'Rachna', 'Mumbai', 21),
       (5, 'Shubham', 'Delhi', 21)]

# find total number of rows and columns in list for tkinter
total_rows = len(lst)
total_columns = len(lst[0])


# create root window
root = Tk()
root.title("Results")
t = Table(root)
root.mainloop()
 

Комментарии:

1. Вы должны поместить все <tkinter.Entry> объекты в список. Затем вы можете повторить их с помощью for цикла и использовать entry.config(bg=<new background colour>) или entry.config(fg=<new foreground colour>)

2. Как поместить все объекты ввода в список? Не могли бы вы привести пример со списком, о котором вы говорите ?

3. Кстати, вчера я сделал свой собственный виджет таблицы с помощью tkinter, так что ваше время идеально подходит :D.

4. Рад это слышать 😀

Ответ №1:

Попробуйте это:

 import tkinter as tk


# It's better to inherit from `tkinter.Frame` so we can use the table
# as a normal tkinter widget
class Table(tk.Frame):
    def __init__(self, master=None, data=[], **kwargs):
        super().__init__(master, **kwargs)
        self.table = []
        for i, _list in enumerate(data):
            row = []
            for j, entry_data in enumerate(_list):
                entry = tk.Entry(self, width=20, fg="blue",
                                 font=("Arial", 16, "bold"))
                entry.grid(row=i, column=j)
                entry.insert("end", entry_data)
                row.append(entry)
            self.table.append(row)

    def column_config(self, column_number, **kwargs):
        for row in self.table:
            # Call `<tkinter.Entry>.config(**kwargs)`
            row[column_number].config(**kwargs)
              


# take the data
data = [(1, "Raj", "Mumbai", 19),
        (2, "Aaryan", "Pune", 18),
        (3, "Vaishnavi", "Mumbai", 20),
        (4, "Rachna", "Mumbai", 21),
        (5, "Shubham", "Delhi", 21)]

# create root window
root = tk.Tk()
root.title("Results")
table = Table(root, data)
table.pack()
# Column 3 is the last one
table.column_config(3, fg="red", bg="cyan")
root.mainloop()
 

Я внес несколько изменений:

  • Я поставил сделал Table действие, как и любой другой tkinter виджет, унаследовав от tkinter.Frame
  • Я также поместил все записи в список, чтобы позже получить к ним доступ
  • Также я добавил column_config метод

Комментарии:

1. Это действительно кажется лучше. Я попытаюсь изменить свой основной код в соответствии с этим. Большое спасибо!