Abfrage Dateiname: Abbruch auswerten

Fragen zu Tkinter.
Antworten
RolandKM
User
Beiträge: 25
Registriert: Montag 21. Dezember 2020, 10:20

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()
...
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
RolandKM
User
Beiträge: 25
Registriert: Montag 21. Dezember 2020, 10:20

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:

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()
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

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:

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)
RolandKM
User
Beiträge: 25
Registriert: Montag 21. Dezember 2020, 10:20

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()
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Das close ist mit with nicht mehr nötig.
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)
RolandKM
User
Beiträge: 25
Registriert: Montag 21. Dezember 2020, 10:20

Jetzt läuft es bestens. Ja ja, immer die einfachen Sachen :D

Vielen Dank für Deine Hilfe Sirius3, habe einiges dazugelernt.
Antworten