ts7343 hat geschrieben:
1)
Definiere ich eine komplett eigene Klasse fuer das neue Verfahren auf
den File zuzugreifen? Wenn ja, vererbe ich sie dann in meiner Klasse,
z.B. mit: class app_functions(tk.LabelFrame, ScrolledText): ?
Nein, genauer genommen ersetzt das deine Klasse, und vorallem
niemals von zwei Tkinter.Widget Klassen ableiten, da sich die Atrribute gegnseitig Überschreiben würden.
zB. ist in Scrolledtext die "width" Angabe für die Anzahl der Columns und nicht wie beim Labelframe in Pixel.
Generell gilt doppelte Ableitungen unter allen Umständen zu vermeiden.
ts7343 hat geschrieben:
1a)
Oder bekomme ich das ganze auch in meine init function hinein?
Wie schon gesagt Brauchst du nicht mehr, du kannst die neue Klasse wie ein normales Widget nutzen, also zB. wie einen Frame.
ts7343 hat geschrieben:
2)
Wieso hat deine Routine ein vertikal Scrollbar, ich sehe keine Definition dafuer,
oder ist die defaultmaessig mit dabei. Ich braeuchte am Ende noch ein horizontal Scrollbar.
Weil ich von ScrolledText abgeleitet habe und wie der Name schon sagt, ist dies eine Erweiterte Textbox, imho braucht eine Textbox keine horizontale Scrollbar, da dies seh unübersichtlich wird.
Wenn du wirklich eine brauchts, müssten entsprechende Funktion noch überladen werden.
Habe ich noch nie gemacht, müsste ich mir mal genauer ansehen wie das beim ScrolledText funktioniert.
ts7343 hat geschrieben:
3)
Wie uebergebe ich rows und columns des Textwidgets in meiner eigentlichen Definition,
zur Zeit setze ich ja mit:
self.lsf_view_01.configure(width=110,height=50)
in der urspruenlichen init function, geht es irgendwie dann aehnlich,
dass ich nicht ueber die main function gehen muss?
main-funktion ?
Du musst diese als Parameter mitliefern wenn du Standardparameter haben möchtest, kannst du diese gerne setzen.
Du müsstest dann in meiner init folgendes schreiben:
Code: Alles auswählen
def __init__(self, master, textfile, rows=50, columns=110, cnf={}):
Denk aber daran, das sind jetzt Zeichen, keine Pixel mehr.
ts7343 hat geschrieben:
4)
Was ist dieses Konstrukt:
with open(textfile) as view_file:
self.text = view_file.read()
Ist das irgendwie effizienter als erst den File in den Memory zu lesen (dauert ja nicht lange,
wuerde ich zur Not so lassen.
Diese Konstruckt, dient dem normalen einlesen seit Python 2.5 für Datein, damit sparst du dir
das aufpassen, ob eine Datei wirklich geschlossen wurde.
Und ja das ist aber nicht wegen dem Aufruf effizienter.
Du hast vorher folgendes gemacht:
Code: Alles auswählen
Hole mir das handle auf die Datei test.txt.
Schreibe jedes Byte einer Zeile in die Variable my_line_list.
Dann gehe jedes Byte in my_line_list durch und zähle in Einserschritten mit.
#Welche du im endeffekt gar nicht benötigst
Dann jedes Byte in die Textbox schreiben
Textbox alle Zeichen aktualisieren lassen.
Also sehr viele unötige Sachen, ich mach nun nur noch
Code: Alles auswählen
Mit open von der Datei test.txt ein handle auf view_file geben.
Alle Bytes in die Variable self.text schreiben.
ts7343 hat geschrieben:
Wieso kriegst du diesen Effekt dann hin, dass er nach und nach den Inhalt
in das Textwidget schreibt, es gibt keinen loop oder so, wie kann man sich
das vorstellen? Hat das was mit dem step zu tun? Aber das ist doch keine Methode oder
eine Eigenschaft von Textwidget, oder? Das krieg ich nicht so auf die Reihe.
Oha, ja den step kannst du dir sparen, der ist unötig, da war ich gedanklich noch einen Schritt weiter, der speichert nur die Länge einer Zeile, falls man später eventuell etwas Performanter gestalten müsste und eventuell einzelne Zeilen hinzufügt oder anderes.
Habe mir damit nur ein paar Optionen offen gelassen.
Ok, wie schreib ich nun Sachen in meine Textbox, an folgendes erinnerst du dich noch, oder ?:
Code: Alles auswählen
self.create(0, len(self.text))
def create(self, first, last):
#normal setzen, damit die Box editierbar ist
self.config(state="normal")
# Box leeren
self.delete(1.0, "end")
#Box füllen
self.insert("end", self.text[first:last])
#Box editierung wieder verbieten
self.config(state='disabled')
Hier lege ich eine Methode an, welche eine bestimmte Zeichenkette in die Textbox schreibt,
oben im __init__, rufe ich create() auf.
Damit fülle ich die Box und zwar über self.text.
self.text enthählt den vorhin ausgelesen Text, richtig.
Strings können wie Listen geteilt werden, so kann ich mit dem first, last sagen von wo bis wo ich den Text angezeigt haben möchte. zB.
Code: Alles auswählen
>>> string = "Hallo Welt"
>>> print(string[0:4])
Hallo
Das brauchst du aber nur wenn es wirklich zu groß wird.
So wird im Moment nur der gesamte text eingelesen, also würde auch einfach "self.insert('end', self.text)" reichen.
Achso und diese Nach-und-nach effekt ist eine Fähigkeit des Text-Widgets, ist aber auch bei der normalen Textbox vorhanden, nur hast du diesen effekt mit deiner aufwendigen Schleife ausgeschalten.