Frage zu Notenprogramm

Fragen zu Tkinter.
Kleonx
User
Beiträge: 14
Registriert: Dienstag 31. Mai 2016, 17:38

Montag 27. Juni 2016, 12:25

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
BlackJack

Montag 27. Juni 2016, 12:52

@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?
Kleonx
User
Beiträge: 14
Registriert: Dienstag 31. Mai 2016, 17:38

Montag 27. Juni 2016, 13:03

@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.
Kleonx
User
Beiträge: 14
Registriert: Dienstag 31. Mai 2016, 17:38

Montag 27. Juni 2016, 13:06

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
Sirius3
User
Beiträge: 8255
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 27. Juni 2016, 13:17

@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.
BlackJack

Montag 27. Juni 2016, 13:20

@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.
Kleonx
User
Beiträge: 14
Registriert: Dienstag 31. Mai 2016, 17:38

Montag 27. Juni 2016, 13:41

[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.
Kleonx
User
Beiträge: 14
Registriert: Dienstag 31. Mai 2016, 17:38

Montag 27. Juni 2016, 13:56

@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.
Sirius3
User
Beiträge: 8255
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 27. Juni 2016, 14:20

@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.
Kleonx
User
Beiträge: 14
Registriert: Dienstag 31. Mai 2016, 17:38

Montag 27. Juni 2016, 14:34

Könntest du mir eventuell kurz mit der Funktion helfen, weil komme gar nciht weiter.
BlackJack

Montag 27. Juni 2016, 14:49

@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.
Kleonx
User
Beiträge: 14
Registriert: Dienstag 31. Mai 2016, 17:38

Montag 27. Juni 2016, 16:28

Also das einzige Problem welches ich noch habe ist, welche Eingabefelder ich nehmen muss. Weiss das grad einer von euch?
BlackJack

Montag 27. Juni 2016, 17:09

@Kleonx: Am besten die in denen die Eingaben drin stehen die Du benötigst. ;-)
Kleonx
User
Beiträge: 14
Registriert: Dienstag 31. Mai 2016, 17:38

Montag 27. Juni 2016, 17:14

Das wären ja dann die Entry(fenster) oder?
Kleonx
User
Beiträge: 14
Registriert: Dienstag 31. Mai 2016, 17:38

Montag 27. Juni 2016, 17:55

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
Antworten