`load_files()` greift einfach so magisch auf `listFrame` zu, das geht ja nicht wenn man da keine globalen Variablen definiert. Funktionen und Methoden bekommen alles ausser Konstangen als Argument(e) übergeben.
Dann ist da immer noch Pfade als Zeichenketten behandeln und an "/"-aufteilen im Code.
`spath` ist eine Liste die genau *ein* Element enthält. Was nicht wirklich sinnvoll ist. Und was soll das `s` bedeuten?
`opath` wird definiert und nicht verwendet. Und auch da wieder: was soll das `o` bedeuten.
``for i in range(len(sequence)):`` nur um dann mit `i` auf die Elemente von `sequence` zuzugreifen ist in Python ein „anti-pattern“. Man kann direkt über die Elemente von `sequence` iterieren, ohne den Umweg über einen Laufindex.
Absolute Pixelgrössen- und Positionen sind ein No-Go. Das mag auf dem System funktionieren an dem es programmiert wurde, aber auch da nur solange bis der Monitor ausgetauscht wird, oder Systemeinstellungen wie Bildschirmauflösung oder Schriftgrössen geändert werden. Bei mir auf dem Rechner ist die Schaltfläche beispielsweise gar nicht zu sehen. Wenn man `place()` verwendet hat Tk keine Ahnung wie gross das Fenster gemacht werden soll, darum verwendet man `place()` nicht.`load_files()` greift einfach so magisch auf `listFrame` zu, das geht ja nicht wenn man da keine globalen Variablen definiert. Funktionen und Methoden bekommen alles ausser Konstangen als Argument(e) übergeben.
Dann ist da immer noch Pfade als Zeichenketten behandeln und an "/"-aufteilen im Code.
`spath` ist eine Liste die genau *ein* Element enthält. Was nicht wirklich sinnvoll ist. Und was soll das `s` bedeuten?
`opath` wird definiert und nicht verwendet. Und auch da wieder: was soll das `o` bedeuten.
``for i in range(len(sequence)):`` nur um dann mit `i` auf die Elemente von `sequence` zuzugreifen ist in Python ein „anti-pattern“. Man kann direkt über die Elemente von `sequence` iterieren, ohne den Umweg über einen Laufindex.
Absolute Pixelgrössen- und Positionen sind ein No-Go. Das mag auf dem System funktionieren an dem es programmiert wurde, aber auch da nur solange bis der Monitor ausgetauscht wird, oder Systemeinstellungen wie Bildschirmauflösung oder Schriftgrössen geändert werden. Bei mir auf dem Rechner ist die Schaltfläche beispielsweise gar nicht zu sehen. Wenn man `place()` verwendet hat Tk keine Ahnung wie gross das Fenster gemacht werden soll, darum verwendet man `place()` nicht.
Das könnte beispielsweise so aussehen:
Code: Alles auswählen
import tkinter as tk
from pathlib import Path
from tkinter import filedialog, ttk
from tkinter.messagebox import showwarning
def load_files(filenames_var):
filepaths = list(
map(
Path,
filedialog.askopenfilenames(
title="Laden von Dateien",
initialdir="/home/hd-arbeit/Dokumente",
filetypes=(
("PDF-Dateien", "*.pdf"),
("Textdateien", "*.txt"),
("Alle Dateien", "*.*"),
),
),
)
)
if filepaths:
name_to_path = {path.name: path for path in filepaths}
assert len(filepaths) == len(name_to_path)
filenames_var.set(list(name_to_path.keys()))
else:
showwarning(
title="Nichts ausgewählt", message="keine Elemente ausgewählt!"
)
def main():
window = tk.Tk()
# hilfselement zur orientierung
tk.Frame(
window,
width=790,
height=20,
borderwidth=1,
relief=tk.RIDGE,
background="light green",
).grid(row=0, column=0)
filenames_frame = ttk.Frame(window, borderwidth=1, relief=tk.RIDGE)
filenames_frame.grid(row=1, column=0, sticky=tk.W)
filenames_var = tk.Variable(value=[])
filenames_listbox = tk.Listbox(
filenames_frame,
listvariable=filenames_var,
width=30,
height=10,
selectmode=tk.EXTENDED,
)
filenames_listbox.pack(side=tk.LEFT)
scrollbar = ttk.Scrollbar(
filenames_frame, orient=tk.VERTICAL, command=filenames_listbox.yview
)
filenames_listbox["yscrollcommand"] = scrollbar.set
scrollbar.pack(side=tk.RIGHT, expand=False, fill=tk.Y)
ttk.Button(
window, text="Dateien laden", command=lambda: load_files(filenames_var)
).grid(row=2, column=0, sticky=tk.W)
window.mainloop()
if __name__ == "__main__":
main()
Wobei das hier jetzt nur das ”optische” löst. Wenn man da irgendwie sinnvoll mit der Auswahl arbeiten möchte, dann muss das in einem Objekt gekapselt werden, also eine Klasse geschrieben werden, denn sonst kann man mit den Pfad-Objekten ausserhalb der Funktion nicht arbeiten.