Импорт фрейма данных Pandas в графический интерфейс WxGlade

Я экспериментировал с использованием DataFrames в графическом интерфейсе, но у меня возникли некоторые проблемы, которые действительно раздражают. Мой код работает, но я просто не вижу, чего мне не хватает, чтобы мой DataFrame отображался в моем графическом интерфейсе. Я создал сетку и стили, но данные не загружаются.

Можете ли вы помочь показать мне, что мне не хватает, пожалуйста.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# generated by wxGlade 0.9.3 on Tue Apr  9 09:46:29 2019
#

import wx
import wx.grid
import numpy as np
import pandas as pd

#colors

EVEN_ROW_COLOUR = '#CCE6FF'
GRID_LINE_COLOUR = '#ccc'

# begin wxGlade: dependencies
# end wxGlade

# begin wxGlade: extracode
# end wxGlade


class MySD_Frame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MySD_Frame.__init__
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((1289, 685))
        self.button_6 = wx.Button(self, wx.ID_ANY, "button_6")
        self.button_7 = wx.Button(self, wx.ID_ANY, "button_7")
        self.button_8 = wx.Button(self, wx.ID_ANY, "button_8")
        self.button_11 = wx.Button(self, wx.ID_ANY, "button_11")
        self.button_9 = wx.Button(self, wx.ID_ANY, "button_9")
        self.button_10 = wx.Button(self, wx.ID_ANY, "button_10")
        self.MyTable = wx.grid.Grid(self, wx.ID_ANY, size=(1, 1))

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: MySD_Frame.__set_properties
        self.SetTitle("frame")
        self.SetBackgroundColour(wx.Colour(50, 58, 114))
       # self.GridTableBase.
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MySD_Frame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_6 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_9 = wx.BoxSizer(wx.VERTICAL)
        sizer_10 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_3 = wx.BoxSizer(wx.VERTICAL)
        sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_5 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_1 = wx.GridSizer(1, 9, 0, 0)
        sizer_15 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_14 = wx.BoxSizer(wx.HORIZONTAL)
        bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap('PNG PATH', wx.BITMAP_TYPE_ANY))
        sizer_3.Add(bitmap_1, 0, wx.ALIGN_CENTER, 0)
        sizer_14.Add((20, 0), 0, 0, 0)
        sizer_14.Add(self.button_6, 0, wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_1.Add(sizer_14, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.button_7, 0, wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_1.Add(self.button_8, 0, wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_1.Add(self.button_11, 0, wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add((0, 0), 0, 0, 0)
        grid_sizer_1.Add(self.button_9, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, 0)
        sizer_15.Add((40, 20), 0, 0, 0)
        sizer_15.Add(self.button_10, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, 0)
        sizer_15.Add((20, 20), 0, 0, 0)
        grid_sizer_1.Add(sizer_15, 1, wx.EXPAND, 0)
        sizer_5.Add(grid_sizer_1, 1, wx.EXPAND, 0)
        sizer_4.Add(sizer_5, 1, wx.EXPAND, 0)
        sizer_3.Add(sizer_4, 1, wx.EXPAND, 0)
        sizer_1.Add(sizer_3, 1, wx.EXPAND, 0)
        sizer_10.Add((20, 20), 0, 0, 0)
        sizer_10.Add(self.MyTable, 1, wx.EXPAND, 0)
        sizer_10.Add((20, 20), 0, 0, 0)
        sizer_9.Add(sizer_10, 1, wx.EXPAND, 0)
        sizer_9.Add((20, 60), 0, 0, 0)
        sizer_6.Add(sizer_9, 1, wx.EXPAND, 0)
        sizer_2.Add(sizer_6, 1, wx.EXPAND, 0)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        self.Layout()
        # end wxGlade

# end of class MySD_Frame



class DataTable(wx.grid.GridTableBase):
    def __init__(self, data=None):
        wx.grid.GridTableBase.__init__(self)
        self.headerRows = 1
        if data is None:
            data = pd.read_excel('EXCEL PATH')
        self.data = data

    def GetNumberRows(self):
        return len(self.data)

    def GetNumberCols(self):
        return len(self.data.columns) + 1


    def GetValue(self, row, col):
        if col == 0:
            return self.data.index[row]
        return self.data.iloc[row, col - 1]

    def SetValue(self, row, col, value):
        self.data.iloc[row, col - 1] = value

    def GetColLabelValue(self, col):
        if col == 0:
            if self.data.index.name is None:
                return 'Index'
            else:
                return self.data.index.name
        return str(self.data.columns[col - 1])

    def GetTypeName(self, row, col):
        return wx.grid.GRID_VALUE_STRING

    def GetAttr(self, row, col, prop):
        attr = wx.grid.GridCellAttr()
        if row % 2 == 1:
            attr.SetBackgroundColour(EVEN_ROW_COLOUR)
        return attr


    def _init_gui(self):
        df = pd.read_excel('EXCEL PAT')
        table = DataTable(df)

        self.table = DataTable(df)
        self.frame.MyTable.SetTable(self.table, takeOwnership=True)
        grid.AutoSizeColumns()

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(grid, 1, wx.EXPAND)
        self.SetSizer(sizer)

        self.Bind(wx.EVT_CLOSE, self.exit)



class MyApp(wx.App):
    def OnInit(self):
        self.frame = MySD_Frame(None, wx.ID_ANY, "")
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True

        wx.Frame.__init__(self, None, wx.ID_ANY, "Pandas")
        self._init_gui()
        self.Layout()
        self.Show()

# end of class MyApp

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()

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

Разочарован ... думаю, вы должны быть программистом на C#, чтобы получить здесь какую-либо помощь, потому что сообщество python кажется таким ограниченным. Для тех, кому интересно, я читал, смотрел и смотрел видео в этой области, и у меня было несколько отчетов об ошибках при попытке решить эту проблему, но, похоже, я всегда возвращаюсь к этому при прохождении и решении проблем класса.

  File "This code", line 66, in __do_layout
    sizer_7 = wx.grid.MyTable(self.ExcelSheet1)
TypeError: wx._grid.MyTable represents a C++ abstract class and cannot be instantiated

(Я больше не выбрасываю эту ошибку, но сетка все еще не инициализируется)

Снова... Любая помощь будет признательна

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
574
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование «GridTableBase» в качестве имени сетки — действительно странный выбор.

В любом случае, после создания кадра, включая сетку:

    self.table = DataTable(df)
    self.frame.GridTableBase.SetTable(self.table, takeOwnership=True)

В демонстрациях сетки wxPython GridCustTable.py или GridHugeTable.py должно быть достаточно примеров создания виртуальных сеток.

Пожалуйста, уточните... это мой первый язык. У меня есть сетка... У меня есть метод, который работает для импорта данных листа Excel. Я хочу поместить фрейм данных в свою сетку, содержащую данные Excel. Почему GridTableBase... плохая идея именования... Я думал, что это функция модуля wx.GridTableBase... Возможно, я переиграл с кодом, пытаясь заставить его работать, и пропустил его исправление.

Lee Harris 15.04.2019 10:40

GridTableBase исправлен на MyTable.

Lee Harris 15.04.2019 10:52

Пожалуйста, взгляните на примеры, поставляемые с wxGlade, чтобы понять, как структурировать ваше приложение. Например. examples\Calculator\Calculator_Main.py показывает, как импортировать графический интерфейс, созданный в Calculator_GUI.py. Итак, напишите графический интерфейс в модуле, таком как MySD_GUI. Затем создайте основной файл, который импортирует MySD_GUI, создает фрейм, реализует DataTable и приложение. При инициализации фрейма создайте DataTable и вызовите SetTable.

Dietmar Schwertberger 15.04.2019 22:40

Это также описано в документации/учебнике wxGlade «Создание и использование исходного кода», особенно «Пример 2: Импорт и переопределение».

Dietmar Schwertberger 15.04.2019 22:47

Спасибо тебе за это! Приношу свои извинения за разочарование и спасибо за исходники, поскольку они мне нужны. Я обновлю и, надеюсь, однажды это поможет другой потерянной душе, лол, С уважением

Lee Harris 16.04.2019 09:44

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