Hallo, ihr lieben. Hab mich ein wenig in Python 3.6.4 (Win10) eingearbeitet und möchte jetzt ein keines Lernprogramm schreiben. Das Programm soll später in Bereiche - Themen - Kapitel gegliedert werden. Als Anfänger nähere ich mich in kleinen Schritten dem Ziel und hab mit Hilfe von tkinter ein Tool zum erstellen der "Bereich" ( einfache Ordnerstruktur) und der Themen gebastelt. Jetzt möchte ich das ganze auch für die Kapitel haben.
Die Probleme -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Mit der Listbox für die "Themen" möchte ich auf die "Listbox" für die Bereiche zugreifen.
Hier brauche ich dringend einen Lösungsansatz. Super wehre Tutorials zu dem Thema.
Und ich schaffe es nicht die Scrollbar in das Textfeld für den "Kapitel Text" (richtig) einzubinden.
Es liegt an der Umwandlung von .pack zu .grid aber was genau ich falsch mach, verstehe ich nicht.
Am Ende soll eine ".txt"-Datei erzeugt werde. (Das sollte ich aber selber hinkriegen.)
Code ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------
#- neues Kapitel = nk.py ----------------------------------------------------------------------
#--------------------------------------------------------------------------------------------
import os
from tkinter import *
LB = [] # Liste Bereiche ---------------------------------------------------------------------
# Haupt - Pfad = HPf --------------------------------------------------------------------------
HPf = os.environ['HOME'] + "/AppData/Local/Programs/Python/Python36/MeineÜbungen/Quiz/bereiche/"
l_T = os.listdir(HPf) #+ Themen auswahl # Liste der Themen = l_T --------------------------------------
# Die folgende Funktion soll ausgeführt werden,
# wenn der Benutzer den Button Klick me anklickt
def button_action():
e_t = e_nk.get() # Eingabe Text des neuen Kapitel
a_B = efBereich.get("active") # Ausgewählter Bereich
a_T = efThema.get("active") # Ausgewählter Thema
# Meldung bei Eingabefehlern = a_f
if (e_t == ""):
a_f.config(text="Name des neuen Kapitels eingeben.")
else:
if e_t in l_K:
a_f.config(text="Kapitel existiert bereits.")
else:
# Kapitel Pfad = TPf
KPf = (HPf + a_B + "/" + a_T + "/" + e_t)
os.mkdir(KPf)
# with open(".txt", "w") as nkd:
# nkd.write("Test!\n")
a_f.config(text="Kapitel wurde angelegt.")
print(KPf)
#-----------------------------------------------------------------------------------
# --------------------------------------------------------------------------------------
#----------------------------------------------------------------------------------
fenster = Tk()
fenster.title("neues Kapitel erstellen.")
# Schriftart / Grösse -------------------------------------------------------------------------
# Standart Schriftart / Grösse
ssa = "Arial 12"
# Überschriften Schriftart / Grösse
üsa = "Arial 16"
# Frame Namen ------------------------------------------------------------------------------
frame0 = Frame(fenster) # Bereich auswählen
frame1 = Frame(fenster) # neues Thema
frame2 = Frame(fenster) # neues Kapitel
frame3 = Frame(fenster) # Kapitel Text
frame4 = Frame(fenster) # Buttons
# Beschrieftung der Eingabefelder -----------------------------------------------------
Bereich = Label(frame0, text="Bereich auswählen:", font = ssa)
Thema = Label(frame1, text="Thema auswählen:", font = ssa)
# Beschrieftung neues Kapitel = nk ------------------------------------------
nk = Label(frame2, text="Name für das neue Kapitel: ")
KapitelText = Label(frame3, text="Kapitel Text eingeben:", font = ssa)
# Ausgabe Feld ----------------------------------------------------------------------
a_f = Label(frame4)
# Eingabefeld neues Thema = e_nk
e_nk = Entry(frame2, bd=5, width=20) #width = Breite des Eingabefeldes
# Eingabefeld Kapitel Text = e_kt
e_kt = Text(frame3, bd=5, height=10, width=50) #, height=10) #width = Breite des Eingabefeldes
# Auswahl Bereich ---------------------------------------------------------------------
efBereich = Listbox(frame0,height=3)
l_B = os.listdir(HPf) # Liste der Bereiche = l_B --------------------------------------
for l_Bu in (l_B): # Liste untereinander auflisten.
efBereich.insert("end", l_Bu)
print("Bereich:", l_B)
# Auswahl Thema -------------------------------------------------------------------
efThema= Listbox(frame1,height=3)
a_B = efBereich.get("active") # Ausgewählter Bereich
l_T = os.listdir(HPf + "/" + a_B) # Liste der Thema = l_T --------------------------------------
for l_Tu in (l_T): # Liste untereinander auflisten.
efThema.insert("end", l_Tu)
print("Thema:", l_T)
# Auswahl Kapitel -------------------------------------------------------------------
a_T = efThema.get("active") # Ausgewählter Bereich
l_K = os.listdir(HPf + "/" + a_B + "/" + a_T) # Liste der Kapitel = l_K --------------------------------------
for l_Ku in (l_K): # Liste untereinander auflisten.
e_nk.insert("end", l_Ku)
print("Kapitel:", l_K)
# Scrollbar Bereich ------------------------------------------------------
sBereich = Scrollbar(frame0, orient=VERTICAL)
efBereich["yscrollcommand"]=sBereich.set
sBereich["command"]=efBereich.yview
# Scrollbar Thema ------------------------------------------------------
sThema = Scrollbar(frame1, orient=VERTICAL)
efThema["yscrollcommand"]=sThema.set
sThema["command"]=efThema.yview
# Kapitel Text = kt -----------------------------------------------------------------
sb_kt = Scrollbar(frame3, orient=VERTICAL) # Scrollbar Kapitel Text = sb_kt
e_kt["yscrollcommand"]=sb_kt.set
sb_kt["command"]=e_kt.yview
#sb_kt.pack(side=RIGHT, fill=Y)
#e_kt.pack(side=LEFT, fill=Y)
# Button Thema erstellen = b_te ----------------------------------------------
b_te_button = Button(frame4, text="Erstellen", command=button_action)
b_exit_button = Button(frame4, text="Abbrechen", command=fenster.destroy)
#----------------------------------------------------------------------------------
#- Positionen ---------------------------------------------------------------------
#----------------------------------------------------------------------------------
# Bereich -------------------------------------------------------------------------
frame0.grid(row = 0, column = 0)
Bereich.grid(row = 0, column = 0, sticky = (E))
efBereich.grid(row = 0, column = 1, sticky = (W)) # Auswahl Bereich
sBereich.grid(row = 0, column = 2, sticky = (E)) # Scrollbar
# Thema -------------------------------------------------------------
frame1.grid(row = 1, column = 0)
Thema.grid(row = 0, column = 0, sticky = (E))
efThema.grid(row = 0, column = 1, sticky = (W)) # Auswahl Thema
sThema.grid(row = 0, column = 2, sticky = (E)) # Scrollbar
# Kapitel ------------------------------------------------------------
frame2.grid(row = 2, column = 0)
nk.grid(row = 0, column = 0) # Beschrieftung neues Kapitel
e_nk.grid(row = 0, column = 1) # Eingabefeld neues Kapitel
# Kapitel Text -----------------------------------------------------------
frame3.grid(row = 3, column = 0, columnspan = 2)
KapitelText.grid(row = 0 , column = 0) # Kapitel Text
e_kt.grid(row = 1, column = 0, rowspan= 3) # Eingabefeld Kapitel Text
#e_kt.grid(side=LEFT, fill=Y) # Eingabefeld Kapitel Text
#sb_kt.grid(row = 2, column = 0) # Eingabefeld Kapitel Text
#sb_kt.grid(side=RIGHT, fill=Y) # Eingabefeld Kapitel Text
# Buttons -----------------------------------------------------------------
frame4.grid(row = 4, column = 1)
a_f.grid(row = 1, column = 0, columnspan = 2)# Ausgabe Feld
b_te_button.grid(row = 0, column = 0)# Button Thema erstellen
b_exit_button.grid(row = 0, column = 1)
# Programmende ###############################################################################################
mainloop()
Listbox to Listbox, Scrollbar
- __blackjack__
- User
- Beiträge: 14044
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Luzifer999: Als erstes solltest Du die Variablennamen reparieren. Die sollten nicht aus kryptischen Abkürzungen bestehen und nicht durchnummeriert sein. Namen schreibt man in Python klein_mit_unterstrichen. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Keine Variablen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Funktionen und Methoden sollten alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen. Daraus folgt das jede nicht-triviale GUI objektorientierte Programmierung (OOP) benötigt.
Sternchen-Importe sind Böse™. Damit holt man sich bei `tkinter` über 150 Namen ins Modul, von denen nur ein Bruchteil tatsächlich benötigt wird. Und die Namen sind nicht nur aus dem Modul was man importiert sondern auch welche aus den Modulen die `tkinter` importiert. Damit verliert man sehr schnell den Überblick was eigentlich woher kommt. Zudem besteht die Gefahr von Namenskollisionen.
Pfade setzt man nicht mit ``+`` zusammen sondern mit `os.path.join()` oder mit Hilfe vom `pathlib`-Modul.
Die Reihenfolge der Namen in der Liste die `os.listdir()` zurück gibt, ist nicht garantiert. Das sollte man selbst explizit sortieren.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Keine Variablen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Funktionen und Methoden sollten alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen. Daraus folgt das jede nicht-triviale GUI objektorientierte Programmierung (OOP) benötigt.
Sternchen-Importe sind Böse™. Damit holt man sich bei `tkinter` über 150 Namen ins Modul, von denen nur ein Bruchteil tatsächlich benötigt wird. Und die Namen sind nicht nur aus dem Modul was man importiert sondern auch welche aus den Modulen die `tkinter` importiert. Damit verliert man sehr schnell den Überblick was eigentlich woher kommt. Zudem besteht die Gefahr von Namenskollisionen.
Pfade setzt man nicht mit ``+`` zusammen sondern mit `os.path.join()` oder mit Hilfe vom `pathlib`-Modul.
Die Reihenfolge der Namen in der Liste die `os.listdir()` zurück gibt, ist nicht garantiert. Das sollte man selbst explizit sortieren.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
-
- User
- Beiträge: 2
- Registriert: Samstag 11. Mai 2019, 17:35
Zuerst, danke für die schnelle Antwort.
Ja, um die Variablennamen kümmer ich. Ab 3:00Uhr heute Nacht, hab ich nur noch Mist gebaut.
OOP, heisst soviel wie "Abreissen und neu Bauen". Bevor ich mich planlos durch tausende von Tutorials arbeite, kannst du mir ein paar Schlagworte nenne, die in meine Richtung gehen.
os.path.join() schau ich mir auch an, sieht mit dem "+" an "+" auch nicht elegant aus.
Ja, um die Variablennamen kümmer ich. Ab 3:00Uhr heute Nacht, hab ich nur noch Mist gebaut.
OOP, heisst soviel wie "Abreissen und neu Bauen". Bevor ich mich planlos durch tausende von Tutorials arbeite, kannst du mir ein paar Schlagworte nenne, die in meine Richtung gehen.
os.path.join() schau ich mir auch an, sieht mit dem "+" an "+" auch nicht elegant aus.