simple oop question (I think) [solved]

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • eric dexter
    New Member
    • Sep 2006
    • 46

    #1

    simple oop question (I think) [solved]

    I am just trying to acess a function in wordgrid (savefile) to a button
    that is defined in TestFrame. I can't seem to make it work I either
    get an error that my variable isn't global or it makes other
    complaints. thanks in advance.. sorry for the simple question..
    Code:
    import wx 
    import wx.grid as gridlib 
    import sys 
    
    
    #--------------------------------------------------------------------------*- 
    
    
    class WordGrid(gridlib.Grid): 
    
    
        def __init__(self, parent, log): 
            gridlib.Grid.__init__(self, parent, -1) 
            self.loadFile() 
    
    
            self.CreateGrid(len(self.rows), self.widestRow) 
    
    
            for r, row in enumerate(self.rows): 
                for c, col in enumerate(row): 
                    self.SetCellValue(r, c, col) 
                self.SetColSize(c, 10*self.widestCol) 
    
    
            for c, label in enumerate(self.header): 
                self.SetColLabelValue(c, label) 
    
    
        def loadFile(self): 
           #from_file 
           infile = open(sys.argv[1], 'r') #The first argument passed in is 
    the file name 
           foundHeader = False 
           self.rows = [] 
           for line in infile: 
               if sys.argv[2] in line: #look for the second argument and 
    make that the header 
                   #removefirst = line.split(' ') 
                   self.header = line.split() 
                   #foundHeader = 'true' 
                   continue     # we don't want to process this line any 
    further 
               else: 
                   self.rows.append(line.split()) 
    
    
           self.widestRow = max([len(r) for r in self.rows]) 
           self.widestCol = max([len(c) for c in [r for r in self.rows]]) 
        def savefile(self): 
            outfile = open(sys.argv[1], 'w') #open the file defined in the 
    output line for writing 
            for row in self.rows: 
                outfile.write(row) 
    
    
            print('this is a test to see if I can Crash it') 
    
    
    class TestFrame(wx.Frame): 
        def __init__(self, parent, log): 
    
    
            wx.Frame.__init__(self, parent, -1, "Dex Tracker Sco Editor", 
    size=(640,480)) 
            p = wx.Panel(self, -1, style=0) 
            grid = WordGrid(p, log) 
            #grid = CustTableGrid(p, log) 
            b = wx.Button(p, -1, "Save Grid") 
            b.SetDefault() 
            self.Bind(wx.EVT_BUTTON, self.OnButton, b) 
            b.Bind(wx.EVT_SET_FOCUS, self.OnButtonFocus) 
            bs = wx.BoxSizer(wx.VERTICAL) 
            bs.Add(grid, 1, wx.GROW|wx.ALL, 5) 
            bs.Add(b) 
            p.SetSizer(bs) 
    
    
        def OnButton(self, evt): 
            print "button selected" 
            grid = WordGrid(self, log).savefile() 
            #self.WordGrid.savefile(self) 
    
    
        def OnButtonFocus(self, evt): 
            print "button focus" 
    
    
    #--------------------------------------------------------------------------*- 
    #def main(): 
    
    
    def main(From_File, find_string): 
        """This is the entire editor for .sco files..  It doesn't realy 
    care if it is music or not.  Any file that you lay out with even rows 
    and collums 
        can be displayed  The first argument passed to main is the file to 
    be used and the second if the string to be used as the command to set 
    up the header of the grid. 
        The sting you wish to use to identify the header should be placed 
    last so it doesn't show up in the grid. 
        """ 
    
    
        import sys 
    
    
        app = wx.PySimpleApp() 
        frame = TestFrame(None, sys.stdout) 
        frame.Show(True) 
        app.MainLoop() 
        pass 
    
    
    if __name__ == '__main__': 
        import sys 
        #try: 
        main(sys.argv[1], sys.argv[2])
    https://sourceforge.net/projects/dex-tracker
  • bartonc
    Recognized Expert Expert
    • Sep 2006
    • 6478

    #2
    Hey Eric,
    It's great to see that you are using wx! Looks like you're getting the hang of it! Keep at it and keep posting. I hope this is clear and works for you,
    Barton

    should be:
    Code:
    class TestFrame(wx.Frame): 
    	def __init__(self, parent, log): 
     
     
    		wx.Frame.__init__(self, parent, -1, "Dex Tracker Sco Editor", size=(640,480)) 
    		p = wx.Panel(self, -1, style=0) 
    		self.grid = WordGrid(p, log) 
     
    ## ...
     
     
    		bs.Add(self.grid, 1, wx.GROW|wx.ALL, 5)
    Here, self refers to the frame and since
    Code:
    	def OnButton(self, evt): 
    		print "button selected" 
    		self.grid.savefile()
    is a method of the frame, self is the frame here too.

    Comment

    • eric dexter
      New Member
      • Sep 2006
      • 46

      #3
      that seems to work as far as running the program. I seem to be able to change the cell values but the changes are not saved in the file. What is happening is that I get an exact (except it does get rid of the whitespace) copy of what I read but none of my changes (I lost 20k of whitespace and god knows what else invisible charecters). I have tried to read them off the screen but I am getting nowhere with that.

      Code:
      import wx
      import wx.grid as gridlib
      import sys
      
      
      
      #---------------------------------------------------------------------------
      
      class WordGrid(gridlib.Grid):
                
          def __init__(self, parent, log):
              gridlib.Grid.__init__(self, parent, -1)
              self.loadFile()
      
              self.CreateGrid(len(self.rows), self.widestRow)
      
              for r, row in enumerate(self.rows):
                  for c, col in enumerate(row):
                      self.SetCellValue(r, c, col)
                  self.SetColSize(c, 10*self.widestCol)
      
              for c, label in enumerate(self.header):
                  self.SetColLabelValue(c, label)
                  
              self.Bind(gridlib.EVT_GRID_CELL_CHANGE, self.OnCellChange)
      
         
          def OnCellChange(self, evt):
              row = self.GetGridCursorRow()
              col = self.GetGridCursorCol()
              
              #self.SetCellValue(evt.GetRow(), evt.GetPosition(), self.GetValue(row, col))
              #This is the example no good will keep it in the same position
              
              if value == 'no good':
                  self.moveTo = evt.GetRow(), evt.GetCol()   
      
          def loadFile(self):
             #from_file 
             infile = open(sys.argv[1], 'r') #The first argument passed in is the file name
             foundHeader = False
             self.rows = []
             for line in infile:
                 if sys.argv[2] in line: #look for the second argument and make that the header
                     #removefirst = line.split(' ')
                     self.header = line.split()
                     #foundHeader = 'true'
                     continue     # we don't want to process this line any further
                 else:
                     self.rows.append(line.split())
      
             self.widestRow = max([len(r) for r in self.rows])
             self.widestCol = max([len(c) for c in [r for r in self.rows]])
          
          def savefile(self):
              linestring = ''
              outfile = open(sys.argv[1], 'w') #open the file defined in the output line for writing
              for word in self.header:
                  linestring = linestring + word + ' '
              outfile.write(linestring + '\n')
              linestring = ''
              for row in self.rows:
                  for word in row:
                    linestring = linestring + ' ' + word
                  outfile.write(linestring)
                  outfile.write('\n')
                  linestring = ''
              print('this is a test to see if I can Crash it')      
      
      class TestFrame(wx.Frame):
          def __init__(self, parent, log):
      
              wx.Frame.__init__(self, parent, -1, "Dex Tracker Sco Editor", size=(640,480))
              p = wx.Panel(self, -1, style=0)
              self.grid = WordGrid(p, log)
              #grid = CustTableGrid(p, log)
              b = wx.Button(p, -1, "Save Grid")
              b.SetDefault()
              self.Bind(wx.EVT_BUTTON, self.OnButton, b)
              b.Bind(wx.EVT_SET_FOCUS, self.OnButtonFocus)
              bs = wx.BoxSizer(wx.VERTICAL)
              bs.Add(self.grid, 1, wx.GROW|wx.ALL, 5)
              bs.Add(b)
              p.SetSizer(bs)
      
          def OnButton(self, evt):
              print "button selected"
              self.grid.savefile()
              #WordGrid(p, log).savefile(self)
              #grid = WordGrid(self, log).savefile()
              #self.WordGrid.savefile(self)
      
          def OnButtonFocus(self, evt):
              print "button focus"
      
      #---------------------------------------------------------------------------
      #def main():
          
      def main(From_File, find_string):
          """This is the entire editor for .sco files..  It doesn't realy care if it is music or not.  Any file that you lay out with even rows and collums 
          can be displayed  The first argument passed to main is the file to be used and the second if the string to be used as the command to set up the header of the grid.
          The sting you wish to use to identify the header should be placed last so it doesn't show up in the grid.
          """
          
          import sys
              
          app = wx.PySimpleApp()
          frame = TestFrame(None, sys.stdout)
          frame.Show(True)
          app.MainLoop()
          pass
      
      if __name__ == '__main__':
          import sys
          #try: 
          main(sys.argv[1], sys.argv[2])

      Comment

      • bartonc
        Recognized Expert Expert
        • Sep 2006
        • 6478

        #4
        It looks like you are trying to do something like this:
        Code:
        		#self.SetCellValue(evt.GetRow(), evt.GetPosition(), self.GetValue(row, col))
         
        		self.rows[row][col] = self.GetValue(row, col)
        Use lots of print statements when debugging, like
        Code:
        		value = self.GetValue(row, col)
        		print value, type(value)
        to make sure that the wx function returns the type that you need. Sometimes it's a good idea to use
        Code:
        		self.rows[row][col] = str(self.GetValue(row, col))
        just in case it's unicode or wxStr object.

        Comment

        • eric dexter
          New Member
          • Sep 2006
          • 46

          #5
          That worked fantastic thanks alot.

          Comment

          • bartonc
            Recognized Expert Expert
            • Sep 2006
            • 6478

            #6
            Originally posted by eric dexter
            That worked fantastic thanks alot.
            You are quite welcome!

            Comment

            Working...