Вытягивание строк Excel для отображения в виде сетки в tkinter - PullRequest
0 голосов
/ 30 апреля 2019

Я снимаю флуоресцентные клетки с 384-луночного планшета, и мое программное обеспечение выполняет форматированный анализ данных Excel (16 строк × 24 столбца изображений превращаются в список данных, по 2 измерения в каждой лунке, ~ 800 точек данных ). Поскольку существует много ручного взаимодействия с данными, я хочу автоматизировать свою работу, взяв информацию, которая проиндексирована в таблице Excel, и отобразив ее в виде сетки tkinter. Я хочу взять мои данные, отформатировать их из списка обратно на исходный дисплей 16x24. Я хочу иметь возможность взаимодействовать с этими данными, между прочим, но, как новичок в python, я испытываю трудности с отображением этих данных.

Я использовал pandas для чтения моего фрейма данных, но не могу отобразить мой список в соответствующем поле сетки. В идеале я хотел бы, чтобы значения в списке Excel отображались в соответствующей ячейке в сетке tkinter. Например, в моем списке Excel [1]: https://imgur.com/a/N8HAtYl, указаны две точки данных из каждой скважины. Я хочу взять значения из каждой ячейки и отобразить их в соответствующей сетке в tkinter, поэтому среднее значение «A1» будет отображено в столбце 1, строке 1 сетки, A2 будет столбцом 2, строкой 1, A3 будет кол 3 ряд 1 и тд и тп.

Любая помощь была бы отличной, спасибо.

from tkinter import *

import pandas as pd

from pandas import ExcelWriter

from pandas import ExcelFile
df = pd.read_excel('/Users/Zammam/PycharmProjects/Filipin_Analysis_Zammam/data.xlsx', sheet_name='Dataps')
print(()
class Cell():
    FILLED_COLOR_BG = "green"
    EMPTY_COLOR_BG = "white"
    FILLED_COLOR_BORDER = "green"
    EMPTY_COLOR_BORDER = "black"

    def __init__(self, master, x, y, size):
        self.master = master
        self.abs = x
        self.ord = y
        self.size= size
        self.fill= False

    def _switch(self):
        """ Switch if the cell is filled or not. """
        self.fill= not self.fill

    def draw(self):

        if self.master != None :
            fill = Cell.FILLED_COLOR_BG
            outline = Cell.FILLED_COLOR_BORDER

            if not self.fill:
                fill = Cell.EMPTY_COLOR_BG
                outline = Cell.EMPTY_COLOR_BORDER

            xmin = self.abs * self.size
            xmax = xmin + self.size
            ymin = self.ord * self.size
            ymax = ymin + self.size

            self.master.create_rectangle(xmin, ymin, xmax, ymax, fill = fill, outline = outline)

class CellGrid(Canvas):
    def __init__(self,master, rowNumber, columnNumber, cellSize, *args, **kwargs):
        Canvas.__init__(self, master, width = cellSize * columnNumber , height = cellSize * rowNumber, *args, **kwargs)

        self.cellSize = cellSize

        self.grid = []
        for row in range(rowNumber):

            line = []
            for column in range(columnNumber):
                line.append(Cell(self, column, row, cellSize))

            self.grid.append(line)

        #memorize the cells that have been modified to avoid many switching of state during mouse motion.
        self.switched = []

        #bind click action
        self.bind("<Button-1>", self.handleMouseClick)  
        #bind moving while clicking
        self.bind("<B1-Motion>", self.handleMouseMotion)
        #bind release button action - clear the memory of midified cells.
        self.bind("<ButtonRelease-1>", lambda event: self.switched.clear())

        self.draw()



    def draw(self):
        for row in self.grid:
            for cell in row:
                cell.draw()

    def create_text(self):
        for row in self.grid:
            for cell in row:
                for i in df:
                    cell.create_text(text = df)



    def _eventCoords(self, event):
        row = int(event.y / self.cellSize)
        column = int(event.x / self.cellSize)
        return row, column

    def handleMouseClick(self, event):
        row, column = self._eventCoords(event)
        cell = self.grid[row][column]
        cell._switch()
        cell.draw()
        #add the cell to the list of cell switched during the click
        self.switched.append(cell)

    def handleMouseMotion(self, event):
        row, column = self._eventCoords(event)
        cell = self.grid[row][column]

        if cell not in self.switched:
            cell._switch()
            cell.draw()
            self.switched.append(cell)


if __name__ == "__main__" :
    app = Tk()

    grid = CellGrid(app, 16, 24, 15)
    grid.pack()

    app.mainloop()

1 Ответ

0 голосов
/ 30 апреля 2019

Я не знаком с пандами, поэтому буду использовать openpyxl для демонстрации. Вероятно, это будет что-то похожее с пандами или даже проще.

from openpyxl import load_workbook
import tkinter as tk

root = tk.Tk()

file = "your_excel_file.xlsx"
wb = load_workbook(file, data_only=True)
ws = wb.active

r = 0
for row in ws:
    c = 0
    for cell in row:
        tk.Label(root,text=cell.value).grid(row=r,column=c)
        c+=1
    r+=1

root.mainloop()

Быстрый взгляд на использование панд вместо:

df = pd.read_excel('your_excel_file.xlsx',header=None)

for i, row in df.iterrows():
    c = 0
    for cell in row:
        tk.Label(root, text=cell).grid(row=i, column=c)
        c += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...