Hallo zusammen,
ich bin Python-Einsteiger und habe folgende Frage:
Ich möchte eine Datei auswählen und diese weiterverarbeiten. Bei Abbruch der Auswahl soll das Progarmm beendet werden.Wie kann ich das umsetzen (komme mit exception nicht klar)?
rom tkinter import *
from tkinter.filedialog
from tkinter import messagebox
def button_action_start():
filenameI = filedialog.askopenfilename(initialdir = "/", title = "Quelle",filetypes= (("KOO Datei", "*.koo"),("alle","*.*")))
# bei Abbruch -> Ende
filenameO = filedialog.asksaveasfilename(initialdir="/", title="Ziel",filetypes=(("KOO Datei", "*.koo"), ("alle", "*.*")))
# bei Abbruch -> Ende
fobjI = open(filenameI, 'r')
fobjO = open(filenameO, 'w')
for line in fobjI:
# verarbeitung geplant
fobjO.write(line)
fobjI.close()
fobjO.close()
...
Abfrage Dateiname: Abbruch auswerten
Benutze keine *-Importe und auch keine Abkürzungen für Variablennamen, Variablennamen werden komplett klein geschrieben, also filename_input und filename_output.
Objekte sind in Python allesl das obj in fobjI ist also überflüssig. Dateien öffnet man am besten mit dem with-Statement, damit ist garantiert, dass die Datei auch wieder geschlossen wird.
Hast Du Dir den Rückgabewert von askopenfilename schon einmal angeschaut? Welchen Wert hat denn filename_input bei einem Abbruch?
Objekte sind in Python allesl das obj in fobjI ist also überflüssig. Dateien öffnet man am besten mit dem with-Statement, damit ist garantiert, dass die Datei auch wieder geschlossen wird.
Hast Du Dir den Rückgabewert von askopenfilename schon einmal angeschaut? Welchen Wert hat denn filename_input bei einem Abbruch?
Danke Sirius3 für Deine schnelle Antwort.
Ich habe nach Deinen Hinweisen einiges geändert, was zu weiteren Problemen führt. Jetzt wird der Name "Menu" als nicht definiert angemeckert. Ich weiß nicht so richtig, wie ich mit dem with-Statement umgehen soll. Vielleicht kannst Du mir da noch mal auf die Sprünge helfen. Hier mal der komplette Code:
Ich habe nach Deinen Hinweisen einiges geändert, was zu weiteren Problemen führt. Jetzt wird der Name "Menu" als nicht definiert angemeckert. Ich weiß nicht so richtig, wie ich mit dem with-Statement umgehen soll. Vielleicht kannst Du mir da noch mal auf die Sprünge helfen. Hier mal der komplette Code:
Code: Alles auswählen
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
def button_action_start():
filename_import = filedialog.askopenfilename(initialdir = "/", title = "Quelle",filetypes= (("KOO Datei", "*.koo"),("alle","*.*")))
print(filename_input)
filename_output = filedialog.asksaveasfilename(initialdir="/", title="Ziel",filetypes=(("KOO Datei", "*.koo"), ("alle", "*.*")))
print(filename_output)
file_input = open(filename_input, 'r')
file_output = open(filename_output, 'w')
for line in file_input:
# verarbeitung
file_output.write(line)
file_input.close()
file_output.close()
def action_prog_info():
autor_text= "Autor"
messagebox.showinfo(message=autor_text, title="Infos")
fenster = tk.Tk()
fenster.title("Mein Python-Programm")
# Menüleiste erstellen
menuleiste=Menu(fenster)
# Menüs in Menüleiste erstellen
datei_menu=Menu(menuleiste, tearoff=0)
help_menu=Menu(menuleiste, tearoff=0)
# weitere Menüeinträge
datei_menu.add_command(label="Start",command=button_action_start)
datei_menu.add_separator()
datei_menu.add_command(label="Ende", command=fenster.destroy)
help_menu.add_command(label="Info", command=action_prog_info)
# Dropdown-Menüs hinzufügen
menuleiste.add_cascade(label="Datei", menu=datei_menu)
menuleiste.add_cascade(label="Hilfe", menu=help_menu)
# Menüleiste an Fenster übergeben
fenster.config(menu=menuleiste)
info1=Label(fenster,text="Das ist nur eine Infozeile zur Programm-Demo")
start_button=Button(fenster,text="Start",command=button_action_start)
stop_button=Button(fenster,text="E N D E",command=fenster.destroy)
fenster.geometry("300x150")
info1.place(x=10, y=10,width=250, height=20)
start_button.place(x=70, y=50, width=150, height=30)
stop_button.place(x=70, y=100, width=150, height=30)
fenster.mainloop()
Es muß jetzt auch tk.Menu heißen, weil der Name Menu aus dem Tk-Modul kommt, genauso bei Button und Label.
Wie man with verwendet steht mit Beispiel in der Dokumentation:
Wie man with verwendet steht mit Beispiel in der Dokumentation:
Code: Alles auswählen
with open(filename_input) as file_input:
with open(filename_output, 'w') as file_output:
for line in file_input:
# verarbeitung
file_output.write(line)
Ich kann jetzt auswerten, ob jeweils ein Dateiname ausgewählt/eingegeben wurde, aber das Programm "läuft weiter". Ich möchte im Fehlerfall den weiteren Ablauf stoppen, das Programmfenster (Startzustand) soll aber weiterhin sichtbar sein.
Code: Alles auswählen
def button_action_start():
filename_input = filedialog.askopenfilename(initialdir = "/", title = "Quelle",filetypes= (("KOO Datei", "*.koo"),("alle","*.*")))
if not filename_input:
messagebox.showerror("Fehler","Keine Input-Datei ausgewählt")
filename_output = filedialog.asksaveasfilename(initialdir="/", title="Ziel",filetypes=(("KOO Datei", "*.koo"), ("alle", "*.*")))
if not filename_output:
messagebox.showerror("Fehler","Keine Output-Datei definiert")
with open(filename_input,'r') as file_input:
with open(filename_output,'w') as file_output:
for line in file_input:
# verarbeitung
file_output.write(line)
file_input.close()
file_output.close()
Das close ist mit with nicht mehr nötig.
Du suchst einfach `return`?
Du suchst einfach `return`?
Code: Alles auswählen
def button_action_start():
filename_input = filedialog.askopenfilename(initialdir = "/", title = "Quelle",filetypes= (("KOO Datei", "*.koo"),("alle","*.*")))
if not filename_input:
messagebox.showerror("Fehler","Keine Input-Datei ausgewählt")
return
filename_output = filedialog.asksaveasfilename(initialdir="/", title="Ziel",filetypes=(("KOO Datei", "*.koo"), ("alle", "*.*")))
if not filename_output:
messagebox.showerror("Fehler","Keine Output-Datei definiert")
return
with open(filename_input,'r') as file_input:
with open(filename_output,'w') as file_output:
for line in file_input:
# verarbeitung
file_output.write(line)