Seite 1 von 2
ScrolledText unveränderlich machen...
Verfasst: Mittwoch 11. Februar 2009, 21:03
von Python 47
Hallo,
gibt es eine Option für ScrolledText, mit der man einstellen kann, dass der Text innerhalb des Widgets nicht vom Benutzer gelöscht werden kann bzw. neuer Text hereingeschrieben wird, sondern nur explizit Text mit der Methode insert eingefügt wird?
Oder gibt es dafür Alternativen zu ScrolledText`?
Verfasst: Mittwoch 11. Februar 2009, 21:44
von yipyip
sollte es sein.
Mit "tk.NORMAL" wird das Text-Widget wieder editierbar.
yipyip
Verfasst: Mittwoch 11. Februar 2009, 21:57
von yipyip
Ach so, zum Schreiben mit 'insert()' muss das
Widget auf 'state=tk.NORMAL' stehen.
Danach kann man es dann wieder in den Zustand
'tk.DISABLED' setzen.
yipyip
Verfasst: Mittwoch 11. Februar 2009, 22:06
von Python 47
Vielen dank. Genau das hab ich gesucht.
Verfasst: Donnerstag 5. März 2009, 19:27
von Python 47
Hallo,
ich habe noch 2 Fragen zu ScrolledText:
1. Ich füge über eine Funktion, die mit einem Button verknüpft ist, einen Text in das ScrolledText Fenster ein. Zudem habe ich verschiedene Einstellungsmöglichkeiten (Fett, Kursiv, Schriftgröße etc.). Je nachdem welche Funktion ausgewählt wurde, möchte ich font des Fensters ändern. Wenn ich das aber mit config mache, wird der gesammte Text im Fenster verändert. Ich möchte jedoch wie es z.B. bei Word der Fall ist nur den Text fett haben, solange die Option Fett gewählt habe. Text der schon im Fenster steht soll nicht verändert werden.
2. Wenn ich die Schriftgröße größer mache, dann ändert sich auch die Größe des ScrolledText Fensters. Jedoch soll diese immer konstant bleiben. Welche Option ist dafür zu empfehlen?
Verfasst: Sonntag 8. März 2009, 16:49
von Python 47
Hat denn keiner eine Idee? Ohne eine Lösung des Problems ist die Hälfte der Funktionalität des Programmes nicht gegeben
Verfasst: Sonntag 8. März 2009, 17:10
von yipyip
Ich habe mich auch noch nicht so intensiv
mit den Feinheiten des Text-Widgets beschäftigt,
aber schau Dir mal das Konzept mit den "Tags" in
http://www.pythonware.com/library/tkint ... ethods.htm
und
http://infohost.nmt.edu/tcc/help/pubs/t ... thods.html
an.
Mehr als diese kleine Demo kann ich im Moment auch nicht
dazu sagen:
http://paste.pocoo.org/show/106972/
yipyip
Verfasst: Dienstag 10. März 2009, 22:19
von Python 47
Hallo,
das Konzept mit den Tags ist das was ich suche. Hab ein wenig damit rumgespielt und dabei einige Probleme bezüglich meines Programmes festgestellt:
1. Ein bestimmter Text soll immer in der gleichen Farbe und Schriftgröße
sein. Es könnt fiktiv also ungefähr so aussehen:
Thomas:
Heute Morgen um 3 Uhr.
Klaus:
Ok
Thomas:
Bis dann
Thomas soll immer in rot und Klaus in grün sein. Jetzt gibt es aber folgendes Problem:
self.text.tag_add('Thomas', '1.0', '1.8') die 2 Zahlen geben die Zeile und die Anzahl an Zeichen in der Zeile an, die verändert werden sollen. Aber ich kann nicht wissen in welcher Zeile immer Thomas und Klaus steht, da die Nachrichten auch über mehrere Zeilen gehen können.
2. Ich füge immer einen Text in das Textwidget ein. Jedoch kann es ja sein, dass innerhalb des Textes eine Nachricht normal ist, eine andere Fett.
z.B.
Thomas:
Hallo
HALLO?!
dann halt nicht
Somit müsste ich ja für jede Nachricht einen neuen Tag schaffen. Das ist nicht möglich.
Verfasst: Mittwoch 11. März 2009, 13:59
von yipyip
Vielleicht hilft Dir ja der Ansatz in dieser Demo weiter:
http://paste.pocoo.org/show/107402/
Gibt man 'thomas' oder 'klaus' ein, so erscheinen diese
Wörter beim nächsten Key-Event in rot bzw. grün,
egal an welcher Stelle sie stehen.
(Gross- und Kleinschreibung werden nicht berücksichtigt.)
Noch ein Link dazu:
http://effbot.org/tkinterbook/text.htm
yipyip
Verfasst: Mittwoch 11. März 2009, 20:36
von wuf
.... Hier noch etwas zum herumexperimentieren:
[Code
ausgelagert]
Gruss wuf
Verfasst: Mittwoch 11. März 2009, 21:45
von Python 47
Hallo,
vielen dank für eure Beispiele, aber irgendwie bekomm ich es nicht gebacken die tags richtig zu konfigurieren / auf mein Problem anzupassen.
Mit yipps Vorschlag hat es teils geklappt, jedoch ist das Programm oft abgestürzt nachdem ich das 2. mal was in das Textwidget eingefügt hab. Ich poste einfach mal einen wichtigen Ausschnit aus dem Programm und vielleicht könnt ihr ja was draus machen.
http://paste.pocoo.org/show/107477/
Der Username und die IP werden in einem vorhergehenden Fenster eingegeben und in der gewissen Datei cnct.dat abgespeichert. Erstelt einfach die genannte Datei mit localhost und irgendeinen Namen im gegebenen Verzeichnis.
Ich möchte nun, dass der Chatname + das Datum des aktuellen Users in grün ist und des Fremden Users in Rot (allerdings sind die Usernamen die gleichen wenn ihr localhost verwendet)
Wenn die Farbe geändert wird und eine Nachricht über den Sendbutton ins Textfeld eingefügt wird, möchte ich, dass es auch grün erscheint und zwar nur der eingegebene Text zu dem Zeitpunkt als die Farbe grün gewählt wurde.
Ich weiß, dass das alles sehr verwirrend ist (ich blick ja selbst nicht mehr durch
).
Verfasst: Donnerstag 12. März 2009, 00:46
von wuf
Hallo Python 47
Habe mit deinem Skript für Testzwecke folgendes gemacht:
a) Datei einlesen unterdrückt
b) Socket-Kommunikation unterdrückt
c) Taggenerierung plus Tagkonfigurierung für den Sender eingebaut
d) Tagfarbe wird fest vorgegeben ('red')
Funktioniert jetzt nur für den Sender!
Hier das frisierte Skript:
[Code
ausgelagert]
Vielleicht kannst du das Skript auch noch für den Empfänger erweitern. Versuch es einmal.
Gruss wuf
Verfasst: Donnerstag 12. März 2009, 16:02
von yipyip
Du musst doch eigentlich nur die benötigten Tags
zu Beginn mit 'tag_config()' initialisieren und
dann mit 'insert(...,..., passender_tag)' den Text
in das Text-Widget schreiben.
Hier eine gering überarbeitete Version:
http://paste.pocoo.org/show/107573/
(Deine 'cnct.dat' steht bei mir gleichen Verzeichnis wie
das Skript; soll ja Betriebssysteme geben, die
mit 'C:\...' nix anfangen können.)
OOP heisst nicht, dass man einfach 'class...'
obendrüber schreibt.
Ich würde zumindest die Netzwerkfunktionalität
von der Gui trennen.
yipyip
Verfasst: Donnerstag 12. März 2009, 18:59
von wuf
Hallo yipyip
Stimmt die erwähnten Sachen waren mir noch nicht bekannt.
a) Ich wusste nicht, dass mit der Methode .tag_config ein noch nicht existierender Tag mit gleichzeitiger Konfiguration erstellt werden kann.
b) Ich wusste nicht dass mit der Methode .insert() ein tag mitgegeben werden kann.
Dies vereinfacht die Lösung wesentlich. Danke für deine lehrreichen Tipps. Ich liebe eben manchmal den komplizierten Weg.
Hast du das Skript einmal über die local host IP-Adresse 127.0.0.1 ausprobiert? Tritt bei dir beim senden einer Meldung keine Exception auf?
Gruss wuf
Verfasst: Donnerstag 12. März 2009, 19:31
von yipyip
Hallo wuf,
Zu a)
Ich bis vorgestern auch noch nicht.
Zu b)
Ich bis vorgestern...
Bei mir treten keine Exceptions auf,
weder mit 127.0.0.1
noch mit der mir dynamisch zugeteilten,
aktuellen IP-Adresse.
yipyip
Verfasst: Freitag 13. März 2009, 14:14
von wuf
Hallo yipyip
Danke für deine Antwort.
Habe Versuche mit deinem Skript durchgeführt. Hierfür lese ich die IP-Adresse und Benutzername für die Verbindung nicht aus einer Datei sondern setze die Variablen direkt wie folgt:
Code: Alles auswählen
self.ip = "127.0.0.1" #self.data[0]
self.user = "wuf" #self.data[1]
Hier dein angepasstes Skript:
Code
ausgelagert
Mein Test führte ich wie folgt aus:
a) Eingabe einer Meldung in das hierfür vorgesehene Eingabefeld.
b) Aktivieren der Schaltfläche 'Send'
Dies löst bei mir folgende Exception aus:
Unhandled exception in thread started by <bound method Chat.receive_message of <__main__.Chat object at 0x811caec>>
Traceback (most recent call last):
File "text_format_tags_05_02.py", line 112, in receive_message
self.size, remote="remote")
File "text_format_tags_05_02.py", line 118, in write_message_to_screen
self.textwidget.config(state=Tk.NORMAL)
File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1197, in configure
return self._configure('configure', cnf, kw)
File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1188, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: out of stack space (infinite loop?)
Da mir das Modul 'socket' nicht so bekannt ist weis ich nicht genau was hier abläuft.
Mein Setup:
SuSE 11.0
Python2.5
Kannst du vielleicht den Test mit meinem hier platzierten Skript durchführen?
Besten Dank für deine Bemühung.
Gruss wuf
Verfasst: Freitag 13. März 2009, 14:49
von yipyip
Das Problem ist:
Ich kann dieses Problem bei mir nicht nachvollziehen.
An den Sockets liegts wohl nicht.
Ich vermute mal ganz stark:
Es ist das Threading!
Für die Funktion 'recieve_message()'
wird ein eigener Thread gestartet, der auf die
Gui im Main-Thread zugreift.
Da gab's doch mal ein Posting "Gui, Tkinter, Threads, Queue"
im Codesnippets-Unterforum...
yipyip
Verfasst: Samstag 14. März 2009, 08:27
von wuf
Hallo yipyip
Habe das Skript auf meinem füheren Setup ausprobiert.
TOSHIBA-Satellite
SuSE 10.0
Da funktioniert es
Auf meinem neuen Setup
ACER-Aspire
SuSE 11.0
Funktioniert es nicht. Habe es auch mit anderen Port-Nummern probiert..
Sehe mich wieder einmal mit Höhlenforschung konfrontiert
Danke! Gruss wuf
Verfasst: Samstag 14. März 2009, 10:37
von kaytec
Hallo wuf und yipyip !
Mal mit after() - ist evt. noch nicht optimal.
http://paste.pocoo.org/show/107865/
gruss frank
Verfasst: Samstag 14. März 2009, 14:23
von wuf
Hallo kaytec
Besten Dank für dein Vorschlag. Er ist ein Volltreffer! Irgendwie muss die Methode 'write_message_to_screen(......)' gleichzeitig von zwei Orten aufgerufen werden und somit den Stack durcheinander bringen.
Danke für dein Super-Tipp. Wünsche dir ein schönes Wochenende.
Gruss wuf