tkinter Filedialog will sich nicht öffenen

Fragen zu Tkinter.
Antworten
der_Didi
User
Beiträge: 5
Registriert: Freitag 9. Januar 2015, 11:58

Hallo zusammen,

als Python-Newbie versuche ich gerade mit tkinter einen Filedialog zu erstellen, um den Dateinamen einer Datei zurück zu bekommen und in ein Entry zu schreiben. Hier der Quellcode:

Code: Alles auswählen

from tkinter import *
from openpyxl import *

import csv

def CSVEinlesen(fileName):
  reader = csv.reader(open(fileName, "rb"), delimiter=";")

wb = Workbook()
ws = wb.active

Hauptfenster = Tk()         # Hauptfenster wird erzeugt
Hauptfenster.title("CSV 2 XLSX CSV-Konverter")
Hauptfenster.geometry("440x150")


FileOpenFrame = LabelFrame(Hauptfenster, text="CSV-Datei auswählen", width=430, height=80)
FileOpenFrame.place(x=5, y=5)

CSV_Label = Label(Hauptfenster, text="CSV-Datei")
CSV_Label.place(x=15, y=25)

CSV_Eingabe = Entry(Hauptfenster, width=54)
CSV_Eingabe.place(x=15, y=46)

def lese_Dateinamen():
    # CSV_Eingabe.insert(0, "Sch hab gegliggt!")
    Dateiname = filedialog.askopenfilename()
    CSV_Eingabe.insert(0, Dateiname)
    

FileOpenD = Button(Hauptfenster, text="Datei suchen", command=lese_Dateinamen)
FileOpenD.place(x=350, y=43)

CSV_Konvert = Button(Hauptfenster, text="CSV nach Excel konvertieren!")
CSV_Konvert.place(x=140, y=100)

mainloop()              # benötigt als Event-Schleife für Windows 
Ich bekomme folgende Fehlermeldung:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Internet\Python\Python3.4.2\lib\tkinter\__init__.py", line 1533, in __call__
return self.func(*args)
File "C:\Internet\Python\Scripts\CSV2XLSX\CSV2XLSX.py", line 28, in lese_Dateinamen
Dateiname = filedialog.askopenfilename()
NameError: name 'filedialog' is not defined
Die Codevervollständigung zeigt mir allerdings "filedialog" an. Ich verstehe gerade nicht, wo mein Fehler ist.

Ach ja, ich verwende Python 3.4
BlackJack

@der_Didi: Du musst `filedialog` aus `tkinter` importieren. Und gewöhn Dir die Sternchenimporte ab. Die importieren zwar nicht alles aber dennoch zu viel. Man weiss hinterher beim lesen nicht mehr was eigentlich aus welchem Modul kommt, und es besteht die Gefahr von Namenskollisionen. Wenn man das überall macht dann hebt man den Sinn und Zweck von Modulen nahezu komplett auf.

`place()` ist nicht geeignet um sinnvolle GUIs zu layouten die auch auf anderen als dem Rechner vernünftig aussehen oder überhaupt benutzbar sind, als auf dem Rechner auf dem das mal geschrieben und ausprobiert wurde.

Auf Modulebene gehören nur Konstanten, Funktionen, und Klassen. Das Hauptprogramm steht üblicherweise in einer `main()`-Funktion. Werte betreten Funktionen und Methoden als Argumente und verlassen sie als Rückgabewerte. Man greift ausser auf Konstanten nicht einfach so auf Namen ausserhalb einer Funktion/Methode zu und verändern sollte man sie schon gar nicht. Solche Programme kann man dann ganz schnell nicht mehr nachvollziehen, testen, und erweitern weil alles mit allem irgendwie zusammenhängt, und man keine definierten Schnittstellen hat, sondern tatsächlich immer den gesamten Code lesen und im Kopf haben muss um zu verstehen was passiert.
der_Didi
User
Beiträge: 5
Registriert: Freitag 9. Januar 2015, 11:58

Hallo BlackJack,

vielen Dank für deine Antwort und die vielen Tipps, die gleich frei Haus mit dabei waren. Was den Programmierstil betrifft, den bitte ich zu entschuldigen. Ich habe gestern mit 0 Ahnung von Python angefangen, vor allem erst einmal eine Art Machbarkeitstest durchzuführen und so eine Art Prototyp zu erstellen. Ich werde die nächsten Wochen auf alle Fälle dazu nutzen, meine Python-Fähigkeiten zu verbessern.

Zum eigentlichen Problem: Ich sitze gerade an einem anderen Rechner, um das ganze noch einmal auszuprobieren und, was soll ich sagen, der Code von oben hat auf anhieb funktioniert, ohne, dass ich deinen Verbesserungsvorschlag umgesetzt habe. Das verwirrt mich jetzt. Evtl. besteht irgendwo ein Problem i.S. Umgebung? An Rechner 1 (der wo es nicht funktionieren wollte) arbeite ich mit Aptana/pyDev und an Rechner 2 mit dem IDLE von Python 3.4. Der Interpreter müsste ja der selbe sein, kann etwas anderes der Grund für eine unterschiedliche Interpretation des Codes sein?
BlackJack

@der_Didi: Der Grund könnte in der Tat IDLE sein. Starte Deine Programme am besten immer ausserhalb einer IDE oder eines Editors wenn Du sicher sein möchtest das es sich so verhält wie, nun ja, wenn man es ohne Editor oder IDE startet. :-)
der_Didi
User
Beiträge: 5
Registriert: Freitag 9. Januar 2015, 11:58

Das heißt, über die Konsole die .py-Datei aufrufen? Handhabt Ihr das während der Entwicklung wirklich so? Das klingt recht umständlich.
BlackJack

@der_Didi: Ich verwende einen Editor und keine IDE und ich handhabe das wirklich so. Ist nicht wirklich umständlich. Zum Terminal wechseln, „Cursor hoch”-Taste und dann Eingabetaste um die Startzeile vom letzten Programmstart zu holen und auszuführen ist ziemlich schnell ins „muscle memory” übergegangen. :-)
der_Didi
User
Beiträge: 5
Registriert: Freitag 9. Januar 2015, 11:58

Danke für den Tipp
der_Didi
User
Beiträge: 5
Registriert: Freitag 9. Januar 2015, 11:58

Welchen Editor verwendest du? Wie sieht es da mit der autocompletion aus? Die hilft ja einem Python-Anfänger total
BlackJack

@der_Didi: Ich verwende meistens Sublime Text. Der kostet allerdings Geld. Für Autovervollständigung ist neben den Vorschlägen aus den Worten die bereits in den Dateien verwendet wurden noch das SublimeCodeIntel-Plugin installiert. Grundsätzlich komme ich aber auch ganz gut ohne spezielle Sprachunterstützung aus.
Antworten