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
Speicherzugriffsfehler - wxPython
-
- 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.
Gruß
Dookie
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
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]
-
- 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
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]
*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,,,
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,,,
-
- 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
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]
import this[/code]
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?
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?
-
- 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
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]
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()
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()
-
- 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
Warscheinlich würde ein Update, des einen oder anderen oder beider, helfen.

Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]