Seite 1 von 1
Speicherzugriffsfehler - wxPython
Verfasst: Sonntag 12. September 2004, 12:36
von Stolzi
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
Verfasst: Sonntag 12. September 2004, 13:48
von Dookie
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
Verfasst: Sonntag 12. September 2004, 14:13
von Stolzi
Ja aber ich will ja dass die ganze Datei in den Editor gelesen wird

Verfasst: Sonntag 12. September 2004, 14:54
von Dookie
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
Verfasst: Sonntag 12. September 2004, 15:03
von Stolzi
*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,,,
Verfasst: Sonntag 12. September 2004, 17:07
von Stolzi
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
Verfasst: Sonntag 12. September 2004, 18:05
von Dookie
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
Verfasst: Sonntag 12. September 2004, 18:43
von Stolzi
Also folgendermassen:
??
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?
Verfasst: Sonntag 12. September 2004, 18:49
von Dookie
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
Verfasst: Sonntag 12. September 2004, 22:50
von Christopy
Kannst Du mal den Code posten, mit dem Du in Scintilla schreibst, Stolzi?
Verfasst: Montag 13. September 2004, 05:55
von Stolzi
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()
Verfasst: Montag 13. September 2004, 06:03
von Stolzi
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()
Verfasst: Montag 13. September 2004, 06:36
von Stolzi
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!?!
Verfasst: Montag 13. September 2004, 13:04
von Dookie
welche Python und wxwidgets-version läuft denn auf dem Suserechner?
Warscheinlich würde ein Update, des einen oder anderen oder beider, helfen.
Dookie
Verfasst: Mittwoch 15. September 2004, 05:43
von Stolzi
Hab Python 2.3.3 und WxPython 2.4.2.4 drauf... Muss wohl wirklich daran liegen.
Verfasst: Mittwoch 15. September 2004, 13:22
von mawe
Hi!
Naja, so out of date sind die Versionen auch wieder nicht

Wie groß ist denn die Datei bei der Du den Speicherzugriffsfehler bekommst?
Gruß, mawe