2015-09-21 1 views
0

J'ai créé un cadre avec wxFormBuilder appelé MyFrame1 dans un fichier .py appelé gui.py. J'essaie de lire et d'écrire des valeurs sur cette grille mais j'ai été bloqué pendant des heures pour essayer de résoudre le problème. Ceci est une version simplifiée du code comme l'exemple précédent que j'ai posté était trop compliqué.Comment lire/mettre à jour un wxgrid dans un formulaire que j'ai créé avec wxFormBuilder

L'application est démarrée dans maingridtest.py et j'essaie de lire et d'écrire dans la grille à partir de là. Si j'intergrate tout dans un fichier (wFormBuilder gui et maingridtest dans say 'code.py' je peux lire et écrire à la grille pas de problème.Je veux que le code formbulider gardé séparé pour simplifier les mises à jour au GUI

J'essaie je ne peux pas obtenir python pour trouver m_grid1 dans gui.py.

Voici maingridtest.py

__author__ = 'Paul' 

import wx 
import wx.xrc 
import wx.grid 
from gui import MyFrame1 


class ReadGrid(MyFrame1): 
    def __init__(self, parent): 
     MyFrame1.__init__(self, parent) 

    test = m_grid1.GetCellValue(2, 2) 
    print test 


if __name__ == '__main__': 
    app = wx.App(0) 
    MainApp = MyFrame1(None) 
    MainApp.Show() 
    app.MainLoop() 

et est ici le gui.py

# -*- coding: utf-8 -*- 

########################################################################### 
## Python code generated with wxFormBuilder (version Jun 17 2015) 
## http://www.wxformbuilder.org/ 
## 
## PLEASE DO "NOT" EDIT THIS FILE! 
########################################################################### 

import wx 
import wx.xrc 
import wx.grid 

ID_ABOUT = 1000 

########################################################################### 
## Class MyFrame1 
########################################################################### 

class MyFrame1 (wx.Frame): 

    def __init__(self, parent): 
     wx.Frame.__init__ (self, parent, id = wx.ID_ANY, title = u"Grid Test", pos = wx.DefaultPosition, size = wx.Size(818,525), style = wx.CAPTION|wx.CLOSE_BOX|wx.DEFAULT_FRAME_STYLE|wx.SYSTEM_MENU|wx.TAB_TRAVERSAL) 

     self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) 

     bSizer1 = wx.BoxSizer(wx.VERTICAL) 

     self.m_grid1 = wx.grid.Grid(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0) 

     # Grid 
     self.m_grid1.CreateGrid(5, 5) 
     self.m_grid1.EnableEditing(True) 
     self.m_grid1.EnableGridLines(True) 
     self.m_grid1.EnableDragGridSize(False) 
     self.m_grid1.SetMargins(0, 0) 

     # Columns 
     self.m_grid1.EnableDragColMove(False) 
     self.m_grid1.EnableDragColSize(True) 
     self.m_grid1.SetColLabelSize(30) 
     self.m_grid1.SetColLabelAlignment(wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) 

     # Rows 
     self.m_grid1.EnableDragRowSize(True) 
     self.m_grid1.SetRowLabelSize(80) 
     self.m_grid1.SetRowLabelAlignment(wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) 

     # Label Appearance 

     # Cell Defaults 
     self.m_grid1.SetDefaultCellAlignment(wx.ALIGN_LEFT, wx.ALIGN_TOP) 
     bSizer1.Add(self.m_grid1, 0, wx.ALL, 5) 


     self.SetSizer(bSizer1) 
     self.Layout() 
     self.m_menubar1 = wx.MenuBar(0) 
     self.file = wx.Menu() 
     self.m_menubar1.Append(self.file, u"File") 

     self.help = wx.Menu() 
     self.about = wx.MenuItem(self.help, ID_ABOUT, u"About", wx.EmptyString, wx.ITEM_NORMAL) 
     self.help.AppendItem(self.about) 

     self.m_menubar1.Append(self.help, u"Help") 

     self.SetMenuBar(self.m_menubar1) 


     self.Centre(wx.BOTH) 

     # Connect Events 
     self.Bind(wx.EVT_CLOSE, self.closeGridFrame) 

    def __del__(self): 
     pass 


    # Virtual event handlers, overide them in your derived class 
    def closeGridFrame(self, event): 
     event.Skip() 
+0

Voici le cadre – Finchy70

Répondre

0

Vous venez besoin de changer quelques petites choses:

import wx 
import wx.xrc 
import wx.grid 
from gui import MyFrame1 


class ReadGrid(MyFrame1): 
    def __init__(self, parent): 
     MyFrame1.__init__(self, parent) 


     test = self.m_grid1.GetCellValue(2, 2) 
     print test 


if __name__ == '__main__': 
    app = wx.App(0) 
    MainApp = ReadGrid(None) 
    MainApp.Show() 
    app.MainLoop() 

Tout d'abord, vous devez appeler réellement votre sous-classe, ReadGrid, au lieu de MyFrame. Cela ne marchera pas du tout. Ensuite, vous souhaitez accéder m_grid1 en appelant comme ceci:

test = self.m_grid1.GetCellValue(2, 2) 

Puisque vous ne définissez pas une valeur dans cette cellule, ce sera juste retourner une chaîne vide, alors vous obtenez toujours pas de sortie. Donc, j'édité votre code gui.py donc il a un bouton que vous pouvez utiliser pour obtenir cette valeur:

import wx 
import wx.xrc 
import wx.grid 

ID_ABOUT = 1000 

########################################################################### 
## Class MyFrame1 
########################################################################### 

class MyFrame1 (wx.Frame): 

    def __init__(self, parent): 
     style = wx.CAPTION|wx.CLOSE_BOX|wx.DEFAULT_FRAME_STYLE|wx.SYSTEM_MENU|wx.TAB_TRAVERSAL 
     wx.Frame.__init__ (self, parent, id = wx.ID_ANY, title = u"Grid Test", 
          pos = wx.DefaultPosition, size = wx.Size(818,525), 
          style = style) 
     panel = wx.Panel(self) 

     #self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) 

     bSizer1 = wx.BoxSizer(wx.VERTICAL) 

     self.m_grid1 = wx.grid.Grid(panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0) 

     # Grid 
     self.m_grid1.CreateGrid(5, 5) 
     self.m_grid1.EnableEditing(True) 
     self.m_grid1.EnableGridLines(True) 
     self.m_grid1.EnableDragGridSize(False) 
     self.m_grid1.SetMargins(0, 0) 

     # Columns 
     self.m_grid1.EnableDragColMove(False) 
     self.m_grid1.EnableDragColSize(True) 
     self.m_grid1.SetColLabelSize(30) 
     self.m_grid1.SetColLabelAlignment(wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) 

     # Rows 
     self.m_grid1.EnableDragRowSize(True) 
     self.m_grid1.SetRowLabelSize(80) 
     self.m_grid1.SetRowLabelAlignment(wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) 

     # Label Appearance 

     # Cell Defaults 
     self.m_grid1.SetDefaultCellAlignment(wx.ALIGN_LEFT, wx.ALIGN_TOP) 
     bSizer1.Add(self.m_grid1, 0, wx.ALL, 5) 

     # get a value from the grid 
     value_btn = wx.Button(panel, label='Get Value') 
     value_btn.Bind(wx.EVT_BUTTON, self.onGetValue) 
     bSizer1.Add(value_btn, 0, wx.ALL, 5) 


     panel.SetSizer(bSizer1) 
     self.Layout() 
     self.m_menubar1 = wx.MenuBar(0) 
     self.file = wx.Menu() 
     self.m_menubar1.Append(self.file, u"File") 

     self.help = wx.Menu() 
     self.about = wx.MenuItem(self.help, ID_ABOUT, u"About", wx.EmptyString, wx.ITEM_NORMAL) 
     self.help.AppendItem(self.about) 

     self.m_menubar1.Append(self.help, u"Help") 

     self.SetMenuBar(self.m_menubar1) 


     self.Centre(wx.BOTH) 

     # Connect Events 
     self.Bind(wx.EVT_CLOSE, self.closeGridFrame) 

    def __del__(self): 
     pass 


    # Virtual event handlers, overide them in your derived class 
    def closeGridFrame(self, event): 
     event.Skip() 

    def onGetValue(self, event): 
     value = self.m_grid1.GetCellValue(2, 2) 
     print value 

Je mets également le parent du widget à une instance d'un wx.Panel comme tel est le parent recommandé pour la plupart des widgets. En faisant cela, vous obtiendrez le look approprié sur chaque plate-forme et il vous donne également la possibilité de tabulation entre les widgets correctement.