Seite 1 von 1

Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 12:25
von Kleonx

Code: Alles auswählen

from tkinter import *


liste = []
liste2 = []
# Die folgende Funktion soll ausgeführt werden, wenn
# der Benutzer den Button Klick me anklickt
def button_action():
    ycord = 10
    xcord = 0
    entry_text = eingabefeld.get()
    notenanzahl = int(entry_text)
    if (entry_text == ""):
        welcome_label.config(text="Gib zuerst die Notenanzahl ein.")

    else:
        welcome_label.grid_forget()
        eingabefeld.grid_forget()
        welcome_button.grid_forget()
        exit_button.grid_forget()
        global notenanzahl, notenschnitt, allenoten
        for i in range(notenanzahl):
            ycord += 20
            liste.append(Entry(fenster))
            liste[-1].place(x = xcord,y=ycord)
            liste2.append(Entry(fenster).get())

        notenanzahl = len(liste)
        ycord += 30
        eingabefelder_label = Label(fenster)
        eingabefelder_label.config(text="Gib deinen Notenschnitt ein:")
        eingabefelder_label.place(x= -30, y = ycord, width = 200, height=30)
        ycord += 30
        eingabefeld2 = Entry(fenster)
        eingabefeld2.place(x=0, y=ycord, width=125, height=20)
        ycord += 30
        button2 = Button(fenster,text="OK!", command=calculate_needed_mark)
        button2.place(x=0, y=ycord, width=125, height=20)


def calculate_needed_mark():
  ##  needed_mark = (notenanzahl+1)*notenschnitt-allenoten
    print(liste2)



fenster = Tk()
fenster.title("Notenprogramm")
fenster.geometry("500x500")

# Anweisungs-Label
my_label = Label(fenster, text="Gib deine Noten ein: ")

welcome_label = Label(fenster)

# Hier kann der Benutzer eine Eingabe machen
eingabefeld = Entry(fenster, bd=5, width=40)

welcome_button = Button(fenster, text="Weiter", command=button_action)
exit_button = Button(fenster, text="Beenden", command=fenster.quit)


# Nun fügen wir die Komponenten unserem Fenster hinzu
my_label.grid(row = 0, column = 0)
eingabefeld.grid(row = 0, column = 1)
welcome_button.grid(row = 1, column = 0)
exit_button.grid(row = 1, column = 1)
welcome_label.grid(row= 2, column =0)

mainloop()
Also meine Frage ist wie ich bei der Defintion der Button Action, die Zahlen welche in die Eingabefelder(die in liste1 abgespeichert sind) eingetippt werden irgendwie abspeichern kann um sie später zur berechnung zu gebrauchen

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 12:52
von BlackJack
@Kleonx: Ist irgendwie so ziemlich das gleiche wie hier: viewtopic.php?f=18&t=38593&p=295782#p295744

Da wurde auch schon was zu Sternchenimporten, ``global``, `place(), und schlechten Namen gesagt. Warum fängst Du damit jetzt schon wieder an?

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 13:03
von Kleonx
@BlackJack Mir ist bewusst, dass es keine gute Lösung ist um so ein Programm zu schreiben, jedoch versuche ich die Sachen anzuwenden welche mir im Unterricht beigebracht wurden und mein Lehrer hat mir gesagt, dass ich das Problem am besten mit place() lösen soll, deshalb habe ich wieder place gebraucht, sonst habe ich alles mit Grid() gelöst. Dein Programm war hilfreich einige Schritte besser zu verstehen, doch es hat auch viele Sachen beinhaltet welche ich aufgrund meiner jetzigen Kenntnis völlig nicht nachvollziehen kann.
Die Namen stammen aus einem vorgegeben Programm auf welches wir unsere Programme aufgebaut haben.

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 13:06
von Kleonx
Dazu haben ich auch nicht rausgefunden wie ich die Variablen ohne global weiterverwenden kann.
Aber hättest du eine Idee wie ich mein Problem am besten lösen kann?
Weil wenn ich die Liste printe die, die Eingabefelder beinhaltet kommt: Die Liste beinhaltet : [<tkinter.Entry object at 0x0000000002856710>, <tkinter.Entry object at 0x00000000029C7A20>, <tkinter.Entry object at 0x00000000029C7A90>], jedoch brauche ich die Zahlen welche in diese Eingabefelder eingegeben wurde um das Programm fertigzustellen

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 13:17
von Sirius3
@Kleonx: Wenn Dein Lehrer Sternchenimporte und global verwendet, kannst Du ihn gerne auf dieses Forum hier verweisen, ihm sagen, dass das viele Probleme mit sich bringt und es selbst besser machen. Und da das ein eigenständiges Programm ist, kannst Du die Variablen besser benennen ohne auf irgendetwas Rücksicht zu nehmen. button_action braucht so viel Information von außerhalb, dass es ohne Klasse eigentlich nicht sauber zu programmieren ist.

In Deinem Fall ist doch das Verwenden eines Grids viel einfacher, als zu versuchen per Place die "richtige" Position zu treffen. Die Entries in liste2 werden nirgends angezeigt, also erschließt sich mir der Sinn des ganzen nicht ganz.

Wie man auf den Inhalt eines Eingabefeldes zugreift, weißt Du schon, nun mußt Du Dein Wissen nur auf eine Liste anwenden.

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 13:20
von BlackJack
@Kleonx: Schlechte Vorgaben sind kein Grund die nicht besser zu machen wenn man weiss das sie schlecht sind, und warum, und wie man es besser machen kann. Bessere Namen kannst Du doch wohl verwenden, und das auch begründen. Grid kennst Du und im anderen Thema hatte ich Bildschirmfotos gezeigt wie das bei mir aussieht und das der Button zwei Eingabefelder überdeckt. Auch den Sternchenimport solltest Du mit Deinem Wissen aus der Schule vermeiden können.

`Entry`-Objekte haben eine Methode um deren Textinhalt zu bekommen. Dann gibt's eine Funktion in Python um Zeichenketten die eine Darstellung einer Zahl enthalten in eine Zahl zu wandeln. Und das macht man mit jedem Element in der Liste. Stichwort: Schleife, falls ihr „list comprehension“ noch nicht hattet.

Wobei ich generell diese „Das kenn ich zwar, aber das hatten wir nicht im Unterricht, also verwende ich das nicht“-Haltung nicht nachvollziehen kann. Wenn Schule so etwas fördert, statt das man, zumindest wenn man mag, auch selbstständig weiter lernt und denkt, dann läuft irgend was schief.

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 13:41
von Kleonx
[codebox=pycon file=Unbenannt.txt]from tkinter import *

# Die folgende Funktion soll ausgeführt werden, wenn
# der Benutzer den Button Klick me anklickt
def button_action():
entry_text = eingabefeld.get()
if (entry_text == ""):
welcome_label.config(text="Gib zuerste einen Namen ein.")
else:
entry_text = "Welcome " + entry_text + "!"
welcome_label.config(text=entry_text)

fenster = Tk()
fenster.title("Ich warte auf eine Eingabe von dir.")

# Anweisungs-Label
my_label = Label(fenster, text="Gib deinen Namen ein: ")

# In diesem Label wird nach dem Klick auf den Button der Benutzer
# mit seinem eingegebenen Namen begrüsst.
welcome_label = Label(fenster)

# Hier kann der Benutzer eine Eingabe machen
eingabefeld = Entry(fenster, bd=5, width=40)

welcom_button = Button(fenster, text="Klick me", command=button_action)
exit_button = Button(fenster, text="Beenden", command=fenster.quit)


# Nun fügen wir die Komponenten unserem Fenster hinzu
my_label.grid(row = 0, column = 0)
eingabefeld.grid(row = 0, column = 1)
welcom_button.grid(row = 1, column = 0)
exit_button.grid(row = 1, column = 1)
welcome_label.grid(row = 2, column = 0, columnspan = 2)

mainloop()[/code]

Das ist das Programm, welches wir bekommen hatten mehr Wissen wurde uns nicht zu verfügung gestellt, ich werde versuchen bessere Namen zu finden und das Global zu vermeiden.

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 13:56
von Kleonx
@Sirius3

[codebox=python file=Unbenannt.txt]from tkinter import *


liste = []
liste2 = []
# Die folgende Funktion soll ausgeführt werden, wenn
# der Benutzer den Button Klick OK anklickt
def button_action():
ycord = 10
xcord = 0
entry_text = eingabefeld.get()
notenanzahl = int(entry_text)
if (entry_text == ""):
starting_label.config(text="Gib zuerst die Notenanzahl ein.")

else:
starting_label.grid_forget()
eingabefeld.grid_forget()
starting_button.grid_forget()
exit_button.grid_forget()
for i in range(notenanzahl):
ycord += 20
liste.append(Entry(fenster))
liste[-1].place(x = xcord,y=ycord)
liste2.append(Entry(fenster).get())

notenanzahl = len(liste)
ycord += 30
eingabefelder_label = Label(fenster)
eingabefelder_label.config(text="Gib deinen Notenschnitt ein:")
eingabefelder_label.place(x= -30, y = ycord, width = 200, height=30)
ycord += 30
eingabefeld2 = Entry(fenster)
eingabefeld2.place(x=0, y=ycord, width=125, height=20)
ycord += 30
calcualtion_button = Button(fenster,text="OK!", command=calculate_needed_mark)
calcualtion_button.place(x=0, y=ycord, width=125, height=20)
for i in range(notenanzahl):
liste2.append(Entry(fenster).get())

def calculate_needed_mark():
## needed_mark = (notenanzahl+1)*notenschnitt-allenoten
print(liste2)



fenster = Tk()
fenster.title("Notenprogramm")
fenster.geometry("500x500")

# Anweisungs-Label
my_label = Label(fenster, text="Gib deine Noten ein: ")

starting_label = Label(fenster)

# Hier kann der Benutzer eine Eingabe machen
eingabefeld = Entry(fenster, bd=5, width=40)

starting_button = Button(fenster, text="Weiter", command=button_action)
exit_button = Button(fenster, text="Beenden", command=fenster.quit)


# Nun fügen wir die Komponenten unserem Fenster hinzu
my_label.grid(row = 0, column = 0)
eingabefeld.grid(row = 0, column = 1)
starting_button.grid(row = 1, column = 0)
exit_button.grid(row = 1, column = 1)
starting_label.grid(row= 2, column =0)

mainloop()[/code]

Wäre die neue for Schleife richtig? Weil mir würde kein anderer Weg einfallen.

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 14:20
von Sirius3
@Kleonx: nein, so ist es falsch. Überleg mal, wann die Schleife ausgeführt wird, wann sie eigentlich ausgeführt werden sollte und welche Eingabefelder eigentlich abgefragt werden sollten.

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 14:34
von Kleonx
Könntest du mir eventuell kurz mit der Funktion helfen, weil komme gar nciht weiter.

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 14:49
von BlackJack
@Kleonx: Momentan erstellst Du die Eingabefelder und liest sie gleich danach wieder aus, bevor der Benutzer überhaupt die Möglichkeit hatte dort etwas einzutragen. Du darfst die erst auslesen nachdem der Benutzer seine eingaben gemacht hat und die Schaltfläche gedrückt hat. Dann wenn Du die Ergebnisse verarbeiten willst.

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 16:28
von Kleonx
Also das einzige Problem welches ich noch habe ist, welche Eingabefelder ich nehmen muss. Weiss das grad einer von euch?

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 17:09
von BlackJack
@Kleonx: Am besten die in denen die Eingaben drin stehen die Du benötigst. ;-)

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 17:14
von Kleonx
Das wären ja dann die Entry(fenster) oder?

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 17:55
von Kleonx
Welche Eingabefelder wären das hier, könntest du mir das kurz sagen habe den Überblick verloren. Brauche eure Hilfe so schnell wie möglich, bitte! Brauche eine gute Note in dieser Arbeit

Re: Frage zu Notenprogramm

Verfasst: Montag 27. Juni 2016, 18:55
von Kleonx

Code: Alles auswählen

from tkinter import *


liste = []
liste2 = []
# Die folgende Funktion soll ausgeführt werden, wenn
# der Benutzer den Button Klick OK anklickt
def button_action():
    ycord = 10
    xcord = 0
    entry_text = eingabefeld.get()
    notenanzahl = int(entry_text)
    if (entry_text == ""):
        starting_label.config(text="Gib zuerst die Notenanzahl ein.")

    else:
        global notenanzahl, eingabefeld2, Entry ## globalisiert diese Variabeln
        starting_label.grid_forget()
        eingabefeld.grid_forget()
        starting_button.grid_forget()
        exit_button.grid_forget()
        for i in range(notenanzahl):
            ycord += 20
            liste.append(Entry(fenster))
            liste[-1].place(x = xcord,y=ycord)

        notenanzahl = len(liste)
        ycord += 30
        eingabefelder_label = Label(fenster)
        eingabefelder_label.config(text="Gib deinen Notenschnitt ein:")
        eingabefelder_label.place(x= -30, y = ycord, width = 200, height=30)
        ycord += 30
        eingabefeld2 = Entry(fenster)
        eingabefeld2.place(x=0, y=ycord, width=125, height=20)
        ycord += 30
        calcualtion_button = Button(fenster,text="OK!", command=calculate_needed_mark)
        calcualtion_button.place(x=0, y=ycord, width=125, height=20)
        ycord += 30
        needed_mark_label = Label(fenster)
        needed_mark_label.place(x= -30, y = ycord, width = 200, height=30)

## Rechnet die Note aus die noch benötigt wird
def calculate_needed_mark():
    for i in range(notenanzahl):
            liste2.append(int(Entry.get()))
  ##  needed_mark = (notenanzahl+1)*notenschnitt-allenoten
    print(liste2)

## Fenster Einstellungen

fenster = Tk()
fenster.title("Notenprogramm")
fenster.geometry("500x500")

# Anweisungs-Label
my_label = Label(fenster, text="Gib deine Noten ein: ")

starting_label = Label(fenster)

# Hier kann der Benutzer eine Eingabe machen
eingabefeld = Entry(fenster, bd=5, width=40)

starting_button = Button(fenster, text="Weiter", command=button_action)
exit_button = Button(fenster, text="Beenden", command=fenster.quit)


# Nun fügen wir die Komponenten unserem Fenster hinzu
my_label.grid(row = 0, column = 0)
eingabefeld.grid(row = 0, column = 1)
starting_button.grid(row = 1, column = 0)
exit_button.grid(row = 1, column = 1)
starting_label.grid(row= 2, column =0)

mainloop()

Welche Eingebefelder muss ich bei der for schleife nehmen?

Re: Frage zu Notenprogramm

Verfasst: Dienstag 28. Juni 2016, 07:23
von Sirius3
@Kleonx: wenn Du den Überblick verloren hast, dann mußt Du Dein Programm besser strukturieren. Eine Funktion die mehr als 30 Zeilen hat, ist meist schon zu lang. Du machst in der Funktion auch zu viele verschiedene Sachen. Zudem macht Dein händisches grid per place den Code auch nicht übersichtlicher. Um sich zurechtzufinden helfen sinnvolle Variablennamen. Hättest Du eine Variable noteneingabefelder aka grade_inputfields wäre doch klar, woher Du Deine Noten lesen müßtest. Würdest Du keine globalen Variablen verwenden, könntest Du ganz einfach zurückverfolgen, wo welcher Wert herkommt, den Du in irgendeiner Funktion brauchst. Du siehst also, die Tipps, die wir Dir schon von Anfang an geben, sind nicht einfach nur dazu da, um Dich zu ärgern, sondern gehören zum Handwerkszeug eines jeden Programmierers, damit er nicht früher oder später vor dem selben Problem steht wie Du, dass er nämlich den Überblick verloren hat.