Seite 2 von 2

Verfasst: Mittwoch 9. September 2009, 06:05
von BlackJack
@egerlach: Mal davon abgesehen, dass man `threading` statt `thread` verwenden sollte, darf man nicht von verschiedenen Threads aus auf die GUI zugreifen. Da können die interessantesten Probleme auftauchen.

Verfasst: Montag 21. September 2009, 22:54
von egerlach
Lösung: wenn Umlaute oder sz eingegeben wurden als Nachrichtentext, dann
kam die schon hinreichend bekannte Fehlermeldung:

'ascii' codec can't encode character u'\xfc' in position 41

Da ich die Fehlermeldungen nirgendwo angefangen hatte (schlecht programmiert von mir) sah es so aus, als hätte die GUI den Kontakt zum Programmcode verloren.

Habe mich ausführlichen mit UTF und latin und ... und beschäftigt, da ich eigentlich keine Textverarbeitung mit python mache, sondern eingegebenen Text direkt in eine Datei schreibe, convertiere ich erst gar nicht erst in unicode sondern schreibe den Text direkt mit print heraus, was von einem bash-Skript dann entgegen genommen wird, in den iso-8859-Zeichensatz:

Code: Alles auswählen

print str(listeNachr).encode('iso-8859-1') + freierText.get().encode('iso-8859-1')
Jetzt läufts wie geschmiert :-)
Eckard

Verfasst: Dienstag 22. September 2009, 06:21
von BlackJack
@egerlach: Das wird wahrscheinlich so lange wie geschmiert laufen, bis jemand etwas eingibt, was sich nicht in 'iso-8859-1' kodieren lässt. ;-)

Verfasst: Dienstag 22. September 2009, 14:35
von DasIch
@egerlach Zumindest bei dir würde dein Code schon bei mir versagen weil meine Shell UTF-8 nutzt, sehr ungewöhnlich dürfte dass auch nicht sein. Mal abgesehen davon dass str() (unter 2.x) den Code nach 'ascii' enkodiert.

Besser wäre du nutzt sys.stdout.encoding(wenn vorhanden) für die Ausgabe und sys.stdin.encoding(wenn vorhanden) für die Dekodierung des eingegebenen Textes von der Konsole, bei GUIs sollte unicode zurückkommen. Sollte das encoding der Standardausgabe nicht ermittelbar sein kann man immer noch auf sys.getdefaultencoding() zurückfallen, mit 'replace' um Fehler zu behandeln.

Verfasst: Dienstag 22. September 2009, 15:38
von Dav1d
egerlach hat geschrieben:hier der Code, den ich eingesetzt habe, einfach die Farbe alle 5 Sek ändern.

Code: Alles auswählen

def wechsele_hintergrFarbe(t):
   while True:
        t.config(background="#eeeee6")
        time.sleep(5)
        t.config(background="#e6eade")
        time.sleep(5)
thread.start_new_thread(wechsele_hintergrFarbe,(root,))
ich hab so gut wie keine Ahnung von Tkinter, aber von wx.Python

In wxPython schaut das so aus:

Code: Alles auswählen

          self.timer = wx.Timer(self)
          self.timer.Start(5000) # 5000ms     
          self.Bind(wx.EVT_TIMER, self.on_refresh_bgcolor)
      def on_refresh_bgcolor(self, event):
          # Alle 5 Sekunden wird diese Funktion aufgerufen
          pass
Jetzt bin ich mir nicht ganz sicher, ich glaube das heist in Tkinter

Code: Alles auswählen

root.after(5000, wechsele_hintergrFarbe)
mfg