tkinter/python 2.4.2 verliert sporadisch Kontakt zur GUI

Fragen zu Tkinter.
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.
egerlach
User
Beiträge: 43
Registriert: Samstag 14. März 2009, 21:32

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
BlackJack

@egerlach: Das wird wahrscheinlich so lange wie geschmiert laufen, bis jemand etwas eingibt, was sich nicht in 'iso-8859-1' kodieren lässt. ;-)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

@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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
Antworten