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`?
ScrolledText unveränderlich machen...
Code: Alles auswählen
my_text_widget.config(state=tk.DISABLED)
Mit "tk.NORMAL" wird das Text-Widget wieder editierbar.
yipyip
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?
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?
mfg
Thomas :-)
Thomas :-)
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
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
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.
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.
mfg
Thomas :-)
Thomas :-)
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
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
Zuletzt geändert von wuf am Donnerstag 12. März 2009, 16:58, insgesamt 1-mal geändert.
Take it easy Mates!
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 ).
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 ).
mfg
Thomas :-)
Thomas :-)
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
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
Zuletzt geändert von wuf am Donnerstag 12. März 2009, 16:50, insgesamt 1-mal geändert.
Take it easy Mates!
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
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
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
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
Take it easy Mates!
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:
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:
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
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]
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:
Da mir das Modul 'socket' nicht so bekannt ist weis ich nicht genau was hier abläuft.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?)
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
Take it easy Mates!
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
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
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
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
Take it easy Mates!
Hallo wuf und yipyip !
Mal mit after() - ist evt. noch nicht optimal.
http://paste.pocoo.org/show/107865/
gruss frank
Mal mit after() - ist evt. noch nicht optimal.
http://paste.pocoo.org/show/107865/
gruss frank
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
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
Take it easy Mates!