Как мне прочитать / обновить wxgrid в форме, которую я создал с помощью wxFormBuilder
Я создал фрейм с wxFormBuilder с именем MyFrame1 в файле.py с именем gui.py. Я пытаюсь читать и записывать значения в эту сетку, но застрял в течение нескольких часов, пытаясь решить проблему. Это упрощенная версия кода, поскольку предыдущий пример, который я разместил, был слишком сложным.
Приложение запускается в maingridtest.py, и я пытаюсь оттуда читать и писать в сетку. Если я интегрирую все в один файл (графический интерфейс wFormBuilder и maingridtest, скажем, 'code.py'), я могу без проблем читать и писать в сетку. Я хочу, чтобы код Formbulider оставался отдельным для упрощения обновления графического интерфейса.
Независимо от того, что я пытаюсь, я не могу заставить Python найти m_grid1 в gui.py.
Вот 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()
а вот и 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()
1 ответ
Вам просто нужно изменить пару мелких вещей:
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()
Прежде всего, вам нужно вызвать ваш подкласс, ReadGrid
, вместо MyFrame
, Это не сработает вообще. Далее вы хотите получить доступ m_grid1
называя это так:
test = self.m_grid1.GetCellValue(2, 2)
Поскольку вы не устанавливаете значение в этой ячейке, это просто возвратит пустую строку, поэтому вы все равно не получите никакого вывода. Поэтому я отредактировал ваш gui.py
код, так что у него есть кнопка, которую вы можете использовать, чтобы получить это значение:
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
Я также установил родителя виджета на экземпляр wx.Panel
так как это рекомендуемый родитель для большинства виджетов. Сделав это, вы получите правильный вид на каждую платформу, а также вы сможете правильно переключаться между виджетами.