Как извлечь dict со столбцом строки и значением таблицы в Tkinter

У меня есть следующая таблица в Tkinter Gui, и я хотел знать, как я смогу получить dict со всеми значениями в каждой из ячеек и соответствующими строками и столбцами каждого значения в dict. Вот код:

import tkinter as Tkinter
import random

class App:
    def __init__(self, master):

        frame = Tkinter.Frame(master)

        self.data_readout = Tkinter.Button(frame, text="Collect Data", bd=10, height=2, width=10, command=lambda: self.dataReadout(self.table_values))
        self.data_readout.grid(row=0, column=0, padx=5, pady=5)

        self.table_values = Tkinter.LabelFrame(frame, text="Values", borderwidth=10, relief=Tkinter.GROOVE, padx=10, pady=10)
        self.table_values.grid(row=1, column=0, padx=20, pady=20)

        for i in range(4): #Rows
            for j in range(10): #Columns
                b = Tkinter.Entry(self.table_values, text="", width=5)
                b.grid(row=i, column=j)
                b.insert(0, str(round(random.random()*100)))

        frame.grid(row=0, column=0, padx=20, pady=20)

    def dataReadout(self, frame):
        #returns Dict of row and column
        pass


if __name__ == "__main__":
    root = Tkinter.Tk()
    app = App(root)
    root.mainloop()        

2 ответа

Ниже приведен минимальный пример, который создает Entry поля в виде двумерного списка, а затем помещает одно из значений в метку:

import tkinter as Tkinter
import random

class App:
    def __init__(self, master):

        self.b = list()
        for i in range(4): #Rows
            self.b.append(list())        # to add the 2nd dimension to ith element
            for j in range(10): #Columns
                self.b[i].append(Tkinter.Entry(master, text="", width=5)) # b[i][j]
                self.b[i][j].grid(row=i, column=j)
                self.b[i][j].insert(0, str(round(random.random()*100)))

if __name__ == "__main__":
    root = Tkinter.Tk()
    app = App(root)
    Tkinter.Label(root, text=app.b[3][7].get()).grid()
    root.mainloop()

Я предлагаю вам сохранить таблицу в словаре и использовать встроенный pickle модуль для загрузки и сохранения.

Вот код, который я использовал для создания исходного словаря таблиц и "выбора его" для тестирования (при реальном использовании вы можете захотеть инициализировать его пустыми или нулевыми значениями):

import pickle
from pprint import pprint
import random

# Create table
table = {}
filename = 'table.pkl'
height = 4
width = 10
for i in range(height):
    table[i] = [round(random.random()*100) for _ in range(width)]

with open(filename, 'wb') as output:
    pickle.dump(table, output, pickle.HIGHEST_PROTOCOL)

pprint(table)
print('table created')

Вывод значений в таблице:

{0: [75, 68, 51, 27, 3, 99, 50, 33, 99, 63],
 1: [92, 79, 79, 66, 41, 18, 57, 9, 45, 75],
 2: [34, 75, 67, 92, 38, 93, 28, 76, 75, 38],
 3: [20, 10, 43, 48, 39, 16, 34, 75, 80, 16]}
table created

Затем вы можете загрузить данные в маринованный файл в App.__init__() метод и использовать его, как показано:

class App:
    def __init__(self, master):

        frame = Tkinter.Frame(master)

        self.data_readout = Tkinter.Button(frame,
                                text="Collect Data", bd=10, height=2, width=10,
                                command=lambda: self.dataReadout(self.table_values))
        self.data_readout.grid(row=0, column=0, padx=5, pady=5)

        self.table_values = Tkinter.LabelFrame(frame,
                                text="Values", borderwidth=10,
                                relief=Tkinter.GROOVE, padx=10, pady=10)
        self.table_values.grid(row=1, column=0, padx=20, pady=20)

        # Read table.
        with open('table.pkl', 'rb') as infile:
            table = pickle.load(infile)

        # Use table.
        height = 4
        width = 10
        for i in range(height): #Rows
            for j in range(width): #Columns
                b = Tkinter.Entry(self.table_values, text="", width=5)
                b.grid(row=i, column=j)
                b.insert(0, str(table[i][j]))

        frame.grid(row=0, column=0, padx=20, pady=20)

    def dataReadout(self, frame):
        rowArr = []
        colArr = []
        info = frame.children.values()
        for children in frame.children.values():
            info = children.grid_info()
            print(info)
            for i in info:
                print(i)

Скриншот запущенного приложения. Обратите внимание, что отображаемые значения совпадают со значениями, которые были напечатаны при первом создании таблицы.

Скриншот запущенного приложения

После обновления значений в таблице, если вы хотите, вы можете легко обновить связанный файл с помощью того же pickle.dump() функция, которая использовалась в коде, который изначально создал маринованную таблицу.

Другие вопросы по тегам