Nach Umwandlung in exe Abbruch des Programms

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
muffin
User
Beiträge: 19
Registriert: Dienstag 19. Februar 2013, 10:43

Hi, habe ein Verständnisproblem bei einem Programm.
Über eine GUI (tkinter) Eingabe von mehreren Daten, die ausgelesen werden und in eine html-Datei geschrieben werden sollen.
Im ersten Fall klappt das wunderbar, im 2. Fall bricht das Programm immer ab.
Wer kann mir da helfen? Dankeschön

Code: Alles auswählen

import tkinter.ttk as ttk
import tkinter as tk
import os


main = tk.Tk()
page = ttk.Notebook(main)
page.pack(fill = "both", expand = 1)

daten = tk.Frame()
blubbbb = tk.Frame()

page.add(daten, text = "BLA")
page.add(blubbbb, text = "BLUB")


def readFiles():
    
    daten_file_html = open("daten.html", "a")    

    daten_file_html.write ("<p>Bericht</p>"
                                   "Name {0}, {1}</strong>".format(nachname_entry.get(), vorname_entry.get(), ))
        
    if len(nachname_entry.get()) > 3:
        daten_file_html.write ("BlaBlabBlaBlabBlaBlabBlaBlabBlaBlabBlaBlabBlaBlabBlaBlab.<br/>")
    else:
        daten_file_html.write ("BUUUUUUUUUUUUUUUUUU<br/>")
          
    if len(vorname_entry.get()) > 3:
        ausgabe_betreuer = ("<BlaBlabBlaBlabBlaBlabBlaBlabBlaBlabBlaBlab<br/>")
    else:
        daten_file_html.write ("BAAAAAAAAAAAA<br/>")
    
#wenn ich den jetzt folgenden Teil "aktiv" in meiner EXE aktiv schalte, dann bricht das Programm immer ab, ansonsen läuft die exe
#wenn ich das programm ganz "normal" ausführe , dann klappt alles
    """
    if len(nachname_entry.get()) == 5:
        daten_file_html.write("kjfklsda flk")
    else:
        daten_file_html.write("lsdsdjafl dsöfkjds k")
        
    """   
    daten_file_html.close()
    os.startfile("daten.html", "open")
        
nachname_label = tk.LabelFrame(daten, text = "Nachname")
nachname_label.grid(sticky = "w")
nachname_entry = tk.Entry(nachname_label)
nachname_entry.grid(sticky = "w")
vorname_label = tk.LabelFrame(daten, text = "Vorname")
vorname_label.grid(sticky = "w")
vorname_entry = tk.Entry(daten)
vorname_entry.grid(sticky = "w")


lesenButton = tk.Button(daten, text = "Lesen", command = readFiles)
lesenButton.grid(padx = 5, pady = 5)

if __name__ == '__main__':
    main.mainloop()
Vielen Dank für Eure Hilfe
Zuletzt geändert von Anonymous am Mittwoch 20. Februar 2013, 12:50, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Was ist denn die Fehlermeldung?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
muffin
User
Beiträge: 19
Registriert: Dienstag 19. Februar 2013, 10:43

:oops: :oops: :oops:
Das ist jetzt echt peinlich, dass ich das überlesen habe. Es liegt an den Umlauten.
Wenn ich die raus nehme, dass klappts

Habs jetzt mit

Code: Alles auswählen

# -*- coding: utf-8 -*-
in der Startzeile versucht, das klappt aber auch nicht
:(
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@muffin: ist die Datei denn utf-8 kodiert?
BlackJack

@muffin: Es fehlen Informationen um Dir sinnvoll helfen zu können. Zum Beispiel wie und womit die EXE überhaupt erstellt wurde und wie die Fehlermeldung genau lautet, bei Ausnahmen, bitte inklusive Traceback.
muffin
User
Beiträge: 19
Registriert: Dienstag 19. Februar 2013, 10:43

ähhm - weiß nicht.
Hab in der IDLE Shell mal sys.stdout.encoding eingegeben mit dem ERgebnis: 'cp1252'
Also dann
# -*- 'cp1252' -*-
in der Startzeile
geht aber immer noch nicht
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

muffin hat geschrieben:Also dann
# -*- 'cp1252' -*-
in der Startzeile
geht aber immer noch nicht
Du solltest dort die Codierung angeben in der die Datei gespeichert ist, nicht die Codierung der Kommandozeile.
muffin
User
Beiträge: 19
Registriert: Dienstag 19. Februar 2013, 10:43

Also hier ist die Fehlermeldung

Code: Alles auswählen

C:\Python32\build\exe.win32-3.2>testen.exe
Traceback (most recent call last):
  File "C:\Python32\lib\tkinter\__init__.py", line 1399, in __call__
    return self.func(*args)
  File "testen.py", line 42, in readFiles
UnicodeEncodeError: 'ascii' codec can't encode characters in position 12-20: ord
inal not in range(128)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Python32\lib\site-packages\cx_Freeze\initscripts\Console3.py", line 2
7, in <module>
    exec(code, m.__dict__)
  File "testen.py", line 62, in <module>
  File "C:\Python32\lib\tkinter\__init__.py", line 1009, in mainloop
    self.tk.mainloop(n)
  File "C:\Python32\lib\tkinter\__init__.py", line 1403, in __call__
    self.widget._report_exception()
  File "C:\Python32\lib\tkinter\__init__.py", line 1167, in _report_exception
    root.report_callback_exception(exc, val, tb)
  File "C:\Python32\lib\tkinter\__init__.py", line 1742, in report_callback_exce
ption
    import traceback, sys
  File "C:\Python\32-bit\3.2\lib\traceback.py", line 3, in <module>
  File "C:\Python\32-bit\3.2\lib\linecache.py", line 10, in <module>
  File "C:\Python\32-bit\3.2\lib\tokenize.py", line 28, in <module>
ImportError: No module named re
Die exe wurde mit cx_Freeze erstellt, ich nutze Pyhton 3.2
BlackJack

@muffin: Das Problem hat überhaupt nichts mit dem Umwandeln in eine EXE zu tun. Du versuchst etwas ausserhalb von ASCII in eine Datei zu schreiben wobei die Zeichenkette in Bytes umgewandelt werden muss. Und da darf dann entweder nur ASCII enthalten sein, oder Du musst diese Umwandlung vorher explizit unter Angabe einer Kodierung vornehmen. Das kannst Du entweder jede mal vor dem Schreibaufruf tun, oder Du verwendest das `encoding`-Argumen von `open()`, damit das Dateiobjekt weiss wie es mit Zeichenketten umgehen soll.

Wo wir gerade bei `open()` sind: Die ``with``-Anweisung macht das schliessen einer Datei etwas einfacher/sicherer.
muffin
User
Beiträge: 19
Registriert: Dienstag 19. Februar 2013, 10:43

Ah super, danke BlackJack, das klappt jetzt. Die exe Datei wird nicht mehr gekillt.
Allerdings werden die Umlaute in der html-Datei noch kryptisch ausgegeben habe es mit utf8, und mit iso-8859-1 und mit iso-8859-15 versucht...


Edit:
Ich nehm alles zurück. Ich hatte beim Öffnen der Datei als Option "a" angegeben anstatt "w" und damit habe ich natürlich immer noch den "alten Mist" in meiner html-Datei.

Also nochmals vielen Dank für die schnelle Hilfe
Antworten