proDiva
Окт. 11, 2007 11:53:59
Опять работаю с гридом, пытаюсь вызвать событие wxEVT_GRID_SELECT_CELL и вернуть номер строки выбранной ячейки. Получается, что номер строки возвращается одновременно с событием выбора ячейки…… как результат, возвращается номер строки ячейки, выбранной в предыдущий раз, а не текущей…. Как бы эти действия сделать последовательными, а не одновременными?
proDiva
Окт. 11, 2007 12:01:36
Вот пример:
# -*- coding: cp1251 -*-
“Пример работы с гридом”
from wxPython.wx import *
from wxPython.grid import *
import wx.grid
import wx
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
kwds = wxDEFAULT_FRAME_STYLE
wxFrame.__init__(self, *args, **kwds)
self.SetSize((550, 400))
font_1 = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD)
self.window1 = wxSplitterWindow(self, -1, style=wxNO_BORDER)
self.panel1 = wxPanel(self.window1, -1)
self.panel2 = wxPanel(self.window1, -1)
self.exit = wxButton(self.panel2, -1, “Выход”)
self.exit.SetFont(font_1)
#создание грида
self.grid = wxGrid(self.panel1, -1, size=(1, 1))
self.grid.CreateGrid(100, 100)
self.grid.SetRowLabelSize(40)
self.grid.SetColLabelSize(40)
self.grid.SetMinSize((500,300))
self.grid.SetColLabelValue(0, “Столбец широкий”)
self.grid.SetColSize(0,200)
self.grid.SetColLabelValue(1, “Узкий”)
self.grid.SetColSize(1,50)
EVT_BUTTON(self, self.exit.GetId(), self.on_exit) # выход
EVT_GRID_SELECT_CELL(self.grid, self.on_select) #событие на выбор ячейки
self.panel1.SetMinSize((550, 370))
self.panel2.SetMinSize((550, 30))
self.window1.SetMinSize((550, 400))
sizer = wxBoxSizer(wxVERTICAL)
sizer_1 = wxBoxSizer(wxVERTICAL)
sizer_2 = wxBoxSizer(wxVERTICAL)
sizer_1.Add(self.grid, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
sizer_2.Add(self.exit, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
self.panel1.SetSizer(sizer_1)
self.panel2.SetSizer(sizer_2)
self.window1.SplitHorizontally(self.panel1, self.panel2)
sizer.Add(self.window1, 1, wxALL|wxEXPAND, 0)
self.SetAutoLayout(True)
self.SetSizer(sizer)
self.Layout()
self.Centre()
def on_exit(self, event):
self.Destroy()
def on_select(self, event):
tb = self.grid.GetTable()
if tb.GetNumberRows() > 0:
r = self.grid.GetGridCursorRow()
print “Номер строки ”+str(r)
event.Skip()
class MyApp(wx.App):
def OnInit(self):
wxInitAllImageHandlers()
frame = MyFrame(None, -1, “Пример Грида”)
self.SetTopWindow(frame)
frame.Show()
return 1
if __name__ == “__main__”:
app = MyApp(redirect=True)
app.MainLoop()
Андрей Светлов
Окт. 11, 2007 14:50:11
Бери у event: event.GetCol(), event.GetRow() и т.д.
Кстати, свежий wx ругается на
from wxPython.wx import *
from wxPython.grid import *
нужно менять на
from wx import *
from wx.grid import *
Только нужно заменять wxFrame на wx.Frame, wxALL на wx.ALL etc.
работает и на несвежих :)
P.S. хорошо поставленный вопрос. Имея такой пример, решение проблемемы заняло примерно столько же времени, сколько и написание этого ответа. Спасибо, экономишь свое и чужое время.
proDiva
Окт. 11, 2007 15:00:42
Андрей Светлов
Спасибо! За что люблю этот форум, так это за быструю помощь, что есть самое ценное!