Как извлечь 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()
функция, которая использовалась в коде, который изначально создал маринованную таблицу.