Speicherzugriffsfehler - wxPython

Plattformunabhängige GUIs mit wxWidgets.
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Speicherzugriffsfehler - wxPython

Beitragvon Stolzi » Sonntag 12. September 2004, 12:36

Hallo,
ich bekomme immer einen Speicherzugriffsfehler wenn ich versuche in das Modul wxPython.stc.wxStyledTextCtrl eine grössere Datei zu laden.
Bei einer kleineren mit wenig Text geht es.
Ich packe dazu den Inhalt der Datei per read() in eine Variable und lade diese dann mit SetText() in wxStyledTextCtrl.
Wie löst man sowas? Kann ich irgendwie den Speicher raufdrehen? Oder ist es besser die Datei zeilenweise einzufügen? Wenn die Zeile nun aber seeeehr lang ist?
Danke
Stolzi
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 12. September 2004, 13:48

Hi Stolzi,

du kannst bei read auch einen size-Parameter angeben, dann werden maximal size Zeichen gelesen.

Code: Alles auswählen

max = 256
while True:
    daten = f.read(max)
    if daten != "":
        ... # daten ans TextCtrl schicken
    if len(daten) < max:
        break


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Beitragvon Stolzi » Sonntag 12. September 2004, 14:13

Ja aber ich will ja dass die ganze Datei in den Editor gelesen wird :-(
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 12. September 2004, 14:54

darum ja auch die While-Schleife. Die leist immer einen Block von 256 Zeichen und schickt den ans Textcrtl bis die ganze Datei eingetragen wurde.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Beitragvon Stolzi » Sonntag 12. September 2004, 15:03

*auf Kopf hau*
Klar...
Ok, nun kann ich die Datei zwar in den Editor laden, aber sobald ich dann im Editor scrollen will, oder so.... Speicherzugriffsfehler :-(
Was kann man da tun?
Hat das was mit dem Modul, oder generell mit Python zu tun?
Hier wäre auf alle Fälle die Beschreibung zu dem verwendeten Texteditor:
http://www.scintilla.org/ScintillaDoc.html
Habe da aber nix dazu gefunden,,,
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Beitragvon Stolzi » Sonntag 12. September 2004, 17:07

Ich glaube der Zugriffsfehler wird nicht durch wxStyledTextCtrl ausgelöst, denn ich habe nun das selbe mit wxTextCtrl versucht und habe den selben Fehler.
nur... Was versuchen??
Danke
Stolzi
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 12. September 2004, 18:05

Hi Stolzi,

ich hab mal die docu zu scintilla überflogen, da wird öfter von einem "zero terminated text string" gesprochen. Warscheinlich reichts schon aus, An den geladenen Text ein "\x00" anzuhängen.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Beitragvon Stolzi » Sonntag 12. September 2004, 18:43

Also folgendermassen:

Code: Alles auswählen

textinsert=text+"\x00"

??
Weil da hab ich den Zugriffsfehler genauso :-(
Glaubst du nicht dass es viell doch an Python generell liegt weil es ja wie gesagt beim original wxpython Modul wxTextCtrl das selbe ist?
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 12. September 2004, 18:49

hmm, ich denke das liegt eher am wxwidgets. Vielleicht liegts auch an Deinem Code. Ist der Text in einer lokalen Variable? Könnte sein, daß die dann schon freigegeben wird bevor wx den Text fertig in das Textctrl kopiert hat und dann gibts den Specherzugriffsfehler.


Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Beitragvon Christopy » Sonntag 12. September 2004, 22:50

Kannst Du mal den Code posten, mit dem Du in Scintilla schreibst, Stolzi?
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Beitragvon Stolzi » Montag 13. September 2004, 05:55

Jup, hab mal versucht ihn so aufs wesentliche zu kürzen, dass er nicht die Seite sprengt ;-) Dieser Code sollte funktionieren und bringt bei mir den selben Fehler sobald ich eine Datei öffne:

Code: Alles auswählen

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

from wxPython.wx import *
from wxPython.stc import *
import os

ID_ABOUT=101
ID_EXIT=110
ID_OPEN=102

class MainWindow(wxFrame):
    def __init__(self,parent,id,title):
        wxFrame.__init__(self,parent,wxID_ANY, title, size = (800,600),
                                     style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)

        # A Statusbar in the bottom of the window
        self.CreateStatusBar()

        # Setting up the menu.
        filemenu= wxMenu()
        filemenu.Append(ID_OPEN, "&Open"," Datei öffnen")

        #Ereignisse Menubar
        EVT_MENU(self, ID_OPEN, self.OnOpen)

        # Creating the menubar.
        menuBar = wxMenuBar()
        menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar
        self.SetMenuBar(menuBar)  # Adding the MenuBar to the Frame content.

       
        self.editor=Editorplane(self,-1)

        #Sizen ...
        s = wxBoxSizer(wxHORIZONTAL)
        s.Add(self.editor, 1, wxEXPAND)
        self.SetSizer(s)
        self.SetAutoLayout(True)


        self.Show(true)


    # Datei oeffnen und in Editor laden
    def OnOpen(self,e):
        wildcard = "All files (*.*)|*.*"
        dlg = wxFileDialog(frame, "Choose a file", os.getcwd(), "", wildcard, wxOPEN)

        if dlg.ShowModal() == wxID_OK:
                path = dlg.GetPath()
                self.filename=dlg.GetFilename()
                self.dirname=dlg.GetDirectory()
                filename=os.path.join(self.dirname,self.filename)
                #f=open(filename)
      #max = 256
                #while True:
                #        daten = f.read(max)
                #        if daten != "":
                #         self.editor.neuerText(daten)
                #        if len(daten) < max:
                #         break
                self.editor.neuerText(open(filename).read())
                self.editor.EmptyUndoBuffer()

class Editorplane(wxStyledTextCtrl):
    def __init__(self, parent, id):
        wxStyledTextCtrl.__init__(self, parent, id, style = wxNO_FULL_REPAINT_ON_RESIZE)


    def neuerText(self,textn):
        self.SetText(textn)
        #self.ed.AddText(textn)
        self.EmptyUndoBuffer()


app = wxPySimpleApp()
frame = MainWindow(None, -1, "Nur so zum testen...")
app.MainLoop()
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Beitragvon Stolzi » Montag 13. September 2004, 06:03

Hmm, ich habe nun folgenden simplen Code aus dem Wiki versucht und da bekomme ich bei einer grossen Datei den selben Fehler:

Code: Alles auswählen

import os
from wxPython.wx import *
ID_ABOUT=101
ID_EXIT=110
class MainWindow(wxFrame):
    def __init__(self,parent,id,title):
        wxFrame.__init__(self,parent,wxID_ANY, title, size = ( 200,100),

                                        style=wxDEFAULT_FRAME_STYLE|
                                        wxNO_FULL_REPAINT_ON_RESIZE)
        self.control = wxTextCtrl(self, 1, style=wxTE_MULTILINE)
        self.CreateStatusBar() # A StatusBar in the bottom of the window
        # Setting up the menu.
        filemenu= wxMenu()
        filemenu.Append(ID_ABOUT, "&About"," Information about this program")
        filemenu.AppendSeparator()
        filemenu.Append(ID_EXIT,"E&xit"," Terminate the program")
        # Creating the menubar.
        menuBar = wxMenuBar()
        menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar
        self.SetMenuBar(menuBar)  # Adding the MenuBar to the Frame content.
        EVT_MENU(self, ID_ABOUT, self.OnOpen) # attach the menu-event ID_ABOUT to the
                                                           # method self.OnAbout
        EVT_MENU(self, ID_EXIT, self.OnExit)   # attach the menu-event ID_EXIT to the
                                                           # method self.OnExit
        self.Show(true)
    def OnAbout(self,e):
        d= wxMessageDialog( self, " A sample editor \n"
                            " in wxPython","About Sample Editor", wxOK)
                            # Create a message dialog box
        d.ShowModal() # Shows it
        d.Destroy() # finally destroy it when finished.
    def OnExit(self,e):
        self.Close(true)  # Close the frame.
    def OnOpen(self,e):
        """ Open a file"""
        dlg = wxFileDialog(self, "Choose a file", os.getcwd(), "", "*.*", wxOPEN)
        if dlg.ShowModal() == wxID_OK:
            self.filename=dlg.GetFilename()
            self.dirname=dlg.GetDirectory()
            f=open(os.path.join(self.dirname,self.filename),'r')
            self.control.SetValue(f.read())
            f.close()
        dlg.Destroy()
app = wxPySimpleApp()
frame = MainWindow(None, -1, "Sample editor")
app.MainLoop()
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Beitragvon Stolzi » Montag 13. September 2004, 06:36

Sehr interessant. Habe nun das selbe Script auf meinem Firmencomputer (Win2000 Python Release 2.3.4, der andere war SuSE9.1) getestet und da funktionierts!?!
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 13. September 2004, 13:04

welche Python und wxwidgets-version läuft denn auf dem Suserechner?
Warscheinlich würde ein Update, des einen oder anderen oder beider, helfen.
;)

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Beitragvon Stolzi » Mittwoch 15. September 2004, 05:43

Hab Python 2.3.3 und WxPython 2.4.2.4 drauf... Muss wohl wirklich daran liegen.

Wer ist online?

Mitglieder in diesem Forum: Yahoo [Bot]