ScrolledText unveränderlich machen...

Fragen zu Tkinter.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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`?
mfg

Thomas :-)
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Code: Alles auswählen

my_text_widget.config(state=tk.DISABLED)
sollte es sein.
Mit "tk.NORMAL" wird das Text-Widget wieder editierbar.

:wink:
yipyip
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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.

:wink:
yipyip
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Vielen dank. Genau das hab ich gesucht. :)
mfg

Thomas :-)
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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?
mfg

Thomas :-)
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Hat denn keiner eine Idee? Ohne eine Lösung des Problems ist die Hälfte der Funktionalität des Programmes nicht gegeben :(
mfg

Thomas :-)
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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/

:wink:
yipyip
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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.
mfg

Thomas :-)
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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


:wink:
yipyip
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

.... Hier noch etwas zum herumexperimentieren:

[Code ausgelagert]

Gruss wuf :wink:
Zuletzt geändert von wuf am Donnerstag 12. März 2009, 16:58, insgesamt 1-mal geändert.
Take it easy Mates!
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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 :D).
mfg

Thomas :-)
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 :wink:
Zuletzt geändert von wuf am Donnerstag 12. März 2009, 16:50, insgesamt 1-mal geändert.
Take it easy Mates!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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.

:wink:
yipyip
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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. :D

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 :wink:
Take it easy Mates!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Hallo wuf,
Zu a)
Ich bis vorgestern auch noch nicht.
Zu b)
Ich bis vorgestern... :D :wink:

Bei mir treten keine Exceptions auf,
weder mit 127.0.0.1
noch mit der mir dynamisch zugeteilten,
aktuellen IP-Adresse.

:wink:
yipyip
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 :wink:
Take it easy Mates!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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...

:wink:
yipyip
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 :wink:
Take it easy Mates!
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo wuf und yipyip !

Mal mit after() - ist evt. noch nicht optimal.
http://paste.pocoo.org/show/107865/
gruss frank
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 :wink:
Take it easy Mates!
Antworten