Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > How to update window after wxGrid is updated?

Reply
Thread Tools

How to update window after wxGrid is updated?

 
 
Tim Williams
Guest
Posts: n/a
 
      05-11-2004
Hi.

I'm starting to learn wxPython and for an exercise I'm writing a
simple CSV file viewer. I just read in the CSV file and create a
wx.Grid with the data. I'm using Python 2.3.2 with wxPython 2.4.2.4.

Everything runs fine under linux, but when I try the same code on a
Win XP machine, I have a window, but the frame the grid is in isn't
seen until I do a minimize/maximize on the window. Besides that, it
seems to run fine. I tried to do a self.Refresh(True,
self.grid.GetRect()), but that didn't help.

Here is the code:

#!/bin/env python

"""
Python script to display CSV file in a table using wxPython
"""

import os, sys, csv
import wx, wx.grid

class MyFrame(wx.Frame):
def __init__(self, parent, ID, title, size=(200,200)):
wx.Frame.__init__(self, parent, ID, title,
(-1,-1),size)
self.CreateStatusBar()

self.dirname=os.getcwd()

#create the file menu
filemenu=wx.Menu()
filemenu.Append(wx.ID_OPEN, '&Open', 'Open CSV File')
filemenu.Append(wx.ID_EXIT, 'E&xit', 'Exit the program')

#create the menubar for the frame and add the menu to it
menuBar=wx.MenuBar()
menuBar.Append(filemenu, '&File')
self.SetMenuBar(menuBar)

#set up menu events
wx.EVT_MENU(self, wx.ID_OPEN, self.OnOpen)
wx.EVT_MENU(self, wx.ID_EXIT, self.Exit)

self.Show(True)
return

def OnOpen(self, event):
dlg=wx.FileDialog(self, 'Choose a file',
self.dirname, '',
'CSV files (*.csv)|*.csv|All files
(*.*)|*.*',
wx.OPEN)
if dlg.ShowModal() == wx.ID_OK:
self.dirname=dlg.GetDirectory()
self.filename=os.path.join(self.dirname,dlg.GetFil ename())
self.file=file(self.filename, 'r')
csvfile=csv.reader(self.file)

#grab a sample and see if there is a header
sample=self.file.read(8192)
self.file.seek(0)
if csv.Sniffer().has_header(sample):
colnames=csvfile.next()
else:
row=csvfile.next()
colnames=[]
for i in len(row):
colnames.append('col%d' % i)
self.file.seek(0)

if getattr(self, 'grid', 0): self.grid.Destroy()
self.grid=wx.grid.Grid(self, -1)
self.grid.CreateGrid(0, len(colnames))

#fill in headings
for i in range(len(colnames)):
self.grid.SetColLabelValue(i, colnames[i])

#fill in rows
r=0
for row in csvfile:
self.grid.AppendRows(1)
for i in range(len(row)):
try:
self.grid.SetCellValue(r, i, row[i])
except:
self.grid.AppendCols(1, True)
print r, i, len(row), row[i]
r += 1
self.file.close()
self.grid.AutoSizeColumns(True)
self.Refresh(True, self.grid.GetRect())

def Exit(self, event):
if getattr(self, 'file',0):
self.file.close()
self.Close(True)

class csv_view(wx.App):
def OnInit(self):
self.frame=MyFrame(None, -1, 'CSV viewer', size=(800,500))
self.SetTopWindow(self.frame)
return True

if __name__ == '__main__':
app=csv_view()
app.MainLoop()

##########################

Thanks for any help.
 
Reply With Quote
 
 
 
 
Brian Kelley
Guest
Posts: n/a
 
      05-11-2004
Tim Williams wrote:
> Hi.
>
> I'm starting to learn wxPython and for an exercise I'm writing a
> simple CSV file viewer. I just read in the CSV file and create a
> wx.Grid with the data. I'm using Python 2.3.2 with wxPython 2.4.2.4.
>
> Everything runs fine under linux, but when I try the same code on a
> Win XP machine, I have a window, but the frame the grid is in isn't
> seen until I do a minimize/maximize on the window. Besides that, it
> seems to run fine. I tried to do a self.Refresh(True,
> self.grid.GetRect()), but that didn't help.


Annoying isn't it? There are probably many solutions to this problem,
but the one that I use is:

> self.grid.AutoSizeColumns(True)
> #self.Refresh(True, self.grid.GetRect())

self.twiddle()

def twiddle(self):
x,y = self.GetSize()
self.SetSize((x, y+1))
self.SetSize((x,y))

This forces a repaint of the window and will also add scroll bars if
necessary. You are welcome to join us on the wxpython user list as well
for more in-depth answers.

You have an unrelated bug in your code as well:

for i in len(row):

should be
for i in range(len(row)):


Brian
 
Reply With Quote
 
 
 
 
Hans Nowak
Guest
Posts: n/a
 
      05-12-2004
Tim Williams wrote:
> Hi.
>
> I'm starting to learn wxPython and for an exercise I'm writing a
> simple CSV file viewer. I just read in the CSV file and create a
> wx.Grid with the data. I'm using Python 2.3.2 with wxPython 2.4.2.4.
>
> Everything runs fine under linux, but when I try the same code on a
> Win XP machine, I have a window, but the frame the grid is in isn't
> seen until I do a minimize/maximize on the window. Besides that, it
> seems to run fine. I tried to do a self.Refresh(True,
> self.grid.GetRect()), but that didn't help.


I believe wx.Yield() should do the trick.

 
Reply With Quote
 
Tim Williams
Guest
Posts: n/a
 
      05-15-2004
Brian Kelley <> wrote in message news:<40a11859$0$560$>...
> Tim Williams wrote:
> > Hi.
> >
> > I'm starting to learn wxPython and for an exercise I'm writing a
> > simple CSV file viewer. I just read in the CSV file and create a
> > wx.Grid with the data. I'm using Python 2.3.2 with wxPython 2.4.2.4.
> >
> > Everything runs fine under linux, but when I try the same code on a
> > Win XP machine, I have a window, but the frame the grid is in isn't
> > seen until I do a minimize/maximize on the window. Besides that, it
> > seems to run fine. I tried to do a self.Refresh(True,
> > self.grid.GetRect()), but that didn't help.

>
> Annoying isn't it? There are probably many solutions to this problem,
> but the one that I use is:
>
> > self.grid.AutoSizeColumns(True)
> > #self.Refresh(True, self.grid.GetRect())

> self.twiddle()
>
> def twiddle(self):
> x,y = self.GetSize()
> self.SetSize((x, y+1))
> self.SetSize((x,y))
>
> This forces a repaint of the window and will also add scroll bars if
> necessary. You are welcome to join us on the wxpython user list as well
> for more in-depth answers.
>
> You have an unrelated bug in your code as well:
>
> for i in len(row):
>
> should be
> for i in range(len(row)):
>
>
> Brian


Thanks. I caught this bug after I posted. I've been in a class the
last 3 days. When I get back on Monday, I'll try out your answer and
the other poster's one.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
How can I create a wxgrid dinamically ? Kepes Krisztian Python 0 11-24-2003 08:45 AM
wxGrid (wxPYTHON) rowlabels Johnny Geling Python 6 11-17-2003 07:56 AM
Can't get wxGrid to work GrayGeek Python 2 11-04-2003 11:21 PM
wxGrid? Tom Lee Python 3 09-03-2003 03:00 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57