@TuXX: Das geht nicht wirklich vernünftig mit Funktionen. Jede nicht-triviale GUI braucht objektorientierte Programmierung, also mindestens eine Klasse.
`ttk` wird importiert aber nicht verwendet. Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen. Du hast doch `tkinter` auch bereits als `tk` importiert und sprichst Objekte daraus über diesen Namen an.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Die Fenstergrösse gibt man nicht vor wenn die automatisch vom Inhalt bestimmt wird.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Die Unterstriche kommen (ausser bei Klassen) zwischen die Worte.
Funktions- und Methodennamen beschreiben üblicherweise die Tätigkeit die diese Funktion oder Methode durchführt. `openbutton()` oder `startbutton()` wären tatsächlich auch Tätigkeiten, aber die beiden Funktionen öffnen ja keine Buttons.
Ausserdem sollte man auf die Reihenfolge der Worte achten (wenn man nicht Yoda ist). Das ist kein Knopfstart oder Knopfennde, sondern ein Startknopf und ein Endknopf. Wobei es sehr schräg ist einen Button `end_button` zu nennen und den mit "Starten" zu beschriften. WTF‽
Es gibt nur diese zwei Knöpfe in der GUI, die werden im Grid aber in die dritte Spalte gesetzt‽
Falls `initialdir` immer das Heimatverzeichnis des Benutzers sein soll, das kann man dynamisch ermitteln, und das sogar plattformunabhängig. Da muss man keine Windowspfade hart in den Quelltext schreiben:
Code: Alles auswählen
In [321]: from pathlib import Path
In [322]: Path.home()
Out[322]: PosixPath('/home/bj')
Zwischenstand:
Code: Alles auswählen
#!/usr/bin/env python3
import tkinter as tk
from pathlib import Path
from tkinter.filedialog import askopenfilename
class MainWindow(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title("Test")
self.file_path = None
tk.Button(self, text="Öffnen", command=self.select_file_path).grid(
row=0, column=0, padx=15, pady=15
)
tk.Button(self, text="Starten", command=self.start_whatever).grid(
row=1, column=0, padx=15, pady=15
)
def select_file_path(self):
filename = askopenfilename(
initialdir=Path.home(),
title="Open file",
filetypes=(("xlsx files", "*.xlsx"),),
)
if filename:
self.file_path = Path(filename)
def start_whatever(self):
print(
self.file_path
if self.file_path
else "Es wurde noch kein Pfad ausgewählt!"
)
def main():
MainWindow().mainloop()
if __name__ == "__main__":
main()