Speicherzugriffsfehler - wxPython

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

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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]#!/usr/bin/env python
import this[/code]
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

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

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]#!/usr/bin/env python
import this[/code]
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

*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

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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]#!/usr/bin/env python
import this[/code]
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

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?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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]#!/usr/bin/env python
import this[/code]
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

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

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

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

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!?!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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]#!/usr/bin/env python
import this[/code]
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Hab Python 2.3.3 und WxPython 2.4.2.4 drauf... Muss wohl wirklich daran liegen.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Naja, so out of date sind die Versionen auch wieder nicht :wink:
Wie groß ist denn die Datei bei der Du den Speicherzugriffsfehler bekommst?

Gruß, mawe
Antworten