Re: bad performance with tkinter text widget ?
Verfasst: Montag 22. November 2010, 13:27
Nicht ganz, aber fast, also die Klasse erbt von dem Text-Widget und erstellt einen Frame über sich, also in dem Fall direkt auf root.ts7343 hat geschrieben: 1) Die neue Klasse vererbt das Text Widget, und Textwidget und die beiden Scollbars werden in einen Frame gepackt.
Auf diesen Frame, wie du richtig erkannt hast, liegen dann das Text-Widget mit den Scrollbars.
Strucktur wird also "root --> Frame --> (Text, Scroll1, Scroll2)"
Wichtig ist, nur das die Klasse selbst, von Textwidget erbt.
Aber du hast es schon richtig erkannt.
1. Richtig, "easy to use".ts7343 hat geschrieben: 2) Warum hat die init in der Argumentliste rows, columns, und das cnf-dictionary, koennte man nicht auch die rows und columns ueber das dictionary mitgeben, oder ist das mehr easy to use fuer die rows und columns?
2. weil es für mich schon von Bedeutung ist, das bei zB. Terminal die Angaben bei der Definition gemacht werden
3. bei width und height, denkt man nicht immer sofort an Zeilen und Spalten sondern an Pixel und vondaher ist es etwas verständlicher.
Kannst du aber gerne heraus nehmen.
Hast du ja schon herrausgefunden, hierzu solltest du die Packmanager Theorie verstanden haben.ts7343 hat geschrieben: 3) du benutzt hier intern den pack Manager, kann ich trotzdem den Grid Manager
von aussen fuer mich benutzen?
Ein Widget, kann immer nur einen Packmanager nutzen, du kannst also auf jedem Widget einen anderen Packmanager nutzen.
Aber nie zwei verschiedene auf dem selben Widget.
OOP - MyScrolledText, muss von Text erben.ts7343 hat geschrieben: 4) warum machst du ein __init__ auf das Text widget, koennte man da nicht auch ein __init__
auf den Frame machen und danach ein Text widget definieren, evtl: self.my_text = Text(self) ?
Und wir wollen ein Textwidget keinen Frame, sonst könnte man das auch anders machen, das ist schon richtig.
Aber du musst dir immer ansehen was du brauchst --> ein TextWidget und kein Frame mit einem TextWidget darauf.
Letztendlich dient es nur zur Vereinfachung der Ansteuerung.
Sie mal bitte genau hin was dort passiert,ts7343 hat geschrieben: 5) die beiden Zeilen:sehen irgendwie doppelt gemoppelt aus, du setzt doch in der ersten schon das yscrollcommand,Code: Alles auswählen
cnf.update({"yscrollcommand": self.vbar.set}) self.vbar.configure(command=self.yview)
warum dann noch das configure in der naechsten Zeile?
- bei configure gebe ich das Scrollcommando ein, ohne dieses könntest du die Scrollbars nicht bewegen.
- bei cnf.update setze ich das commando für das TextWidget, da cnf an dieses weiter gegeben wird und setze die Scrollbar auf den ensprechenden Wert der Scrollregion des TextWidgets.
Ohne dieses könntest du zwar in dem TextWidget scrollen, würdest aber kein Feedback bekommen, da die Scrollbars immer auf 0 stehen.
Spricht diese würden sich nicht wirklich bewegen.
Ja, richtig hier ist mir ein kleiner Fehler unterlaufen, weil ich die Packmanager noch im Bytecompile hatte.ts7343 hat geschrieben: 6) Die method loop sieht aus, als wenn du da alle Layout Manager mit abdecken willst,
aber was genau da passiert versteh ich leider nicht, setzt du da die Location des Frames?
Leider laeuft das ganze auch nicht, er bringt mir hierbei:Code: Alles auswählen
methods = vars(Pack).keys() + vars(Grid).keys() + vars(Place).keys() NameError: global name 'Pack' is not defined
Dort muss es heißen tkinter.Pack, tkinter.Grid, tkinter.Place <-- werde das gleich nochmal im Quelltext oben ändern.
Was mach es --> es mach nichts weiter als die Packmanager vom Frame auch für die TextWidget geltend zu machen.
Nein, damit lege ich fest, das jede Instanz dieser Klasse auch wirklich ein "text"-Attribute hat.ts7343 hat geschrieben: 7)
self.text = "" loeschst du damit erst mal grundsaetzlich den Inhalt? Muss das immer dort
stehen weil du ja in der Funktion create auch hast:
self.delete(1.0, END)
Oder brauch man das ganze, damit fest steht, das der Inhalt ein String ist?
Ist bei OOP üblich diese mit leeren Werten zu initialisieren, auch wenn man es in Python jederzeit ergänzen könnte, dies hat aber vorallem den Vorteil Fehler zuvermeiden.
Das self.delete leert nur das Fenster, du musst hier wirklich beachten, das das Attribute "text" nichtsmit dem Text in dem TextWidget zutun hat, sondern lediglich als speicher dient, um den eigentlichen Text anzuzeigen.
Du kannst das Text Attribute ignorieren oder löschen, aber ich finde es einfacher zu sagen
Code: Alles auswählen
textwidget.text = "abc"
textwidget.create()
Code: Alles auswählen
textwidget.config(state=NORMAL)
textwidget.delete(1.0, END)
textwidget.insert(END, "abc")
textwidget.config(state=DISABLED)
Du könntest es zB. so machen das du nur noch create("abc") machen musst.
Ist dir überlassen.
Meinte das TextWidget damit, also welcher Text wirklich angezeigt werden soll.ts7343 hat geschrieben:
Wenn du in den Kommentaren schreibst: Text anzeigen
Ist damit gemeint, den gesamten Text laden oder nur den Ausschnitt?
siehe 7. dazu nochmal.
Richtig, danke noch so ein kleiner Fehler von mir,ts7343 hat geschrieben: 9)
in der main hast du: text_options, die setzen width und height auf 110 und 50,
dann setzt du 50 und 80 fuer rows und columns, das versteh ich nicht, welches ist
davon das wirklich benutzte? Und wie passen beide zusammen?
wenn du hinsiehst, werden die Einträge in width und height überschrieben.
werde dies auch gleich richtig stellen.
Danke für den Hinweis.