Ein Entry mehrere Zeichen

Fragen zu Tkinter.
Antworten
Traumkind
User
Beiträge: 3
Registriert: Freitag 30. November 2018, 15:31

Hallo liebe Menschen,

und zwar stehe ich vor der Aufgabe, dass ich eine Liste, die nur in einem Entry entgegen genommen wird, mit selection sort in tkinter ausgeben möchte und zwar soll der User diverse Zahlen eingeben können und die Ausgabe soll dann eine geordnete Reihenfolge ergeben, soweit auch okay.

Allerdings bekomme ich es nicht hin, dass er output stattfindet, die Eingabe erfolgt, aber die Ausgabe erfolgt nicht. Ich weiß, dass ihr echt besseres vielleicht zu tun habt, aber ich würde dem schon gerne auf den Grund gehen...

da sind bestimmt viele Fehler drin, ich erwarte keine nieder geschriebene Lösung, sondern lediglich ein wenig Hilfe.
Ich wäre sehr dankbar drum:))

liebe Grüße

Code: Alles auswählen

import tkinter as tk

field = "slctn_srt"

class Surface:
        def __init__(self):
            self.root = tk.Tk()  # creating window
            self.root.title("Selection Sort")
            self.root.geometry("400x200")
            self.root.config(bg="red")

            label1 = tk.Label(self.root, text="Bitte geben Sie mehrere Zahlen ein ")
            label1.config(bg="skyblue", fg="green")
            label1.pack()  # add the label to the window

            self.entry1 = tk.Entry(self.root, text="")  # creating an entry
            self.entry1.config(bg="#0f0")
            self.entry1.pack()  # add the entry to the window

            self.label2 = tk.Label(self.root, text="")  # creating a label
            self.label2.pack()  # add the label to the window

            button1 = tk.Button(self.root, text="Hilfe", command=self.clicked_button_help)  # creating a button
            # command is the method that will calles by presed on the button
            button1.pack()  # add the button to the window

            self.label2 = tk.Label(self.root, text="")  # creating a label
            self.label2.pack()  # add the label to the window

            clicked_button_slctn_sort = tk.Button(self.root, text="alle ausgeben", command=self.clicked_button_slctn_sort)  # creating a button
            # command is the method that will calles by presed on the button
            clicked_button_slctn_sort.pack()  # add the button to the window
            self.root.mainloop()  # need to "repaint" the window

        def clicked_button_help(self):
            print("Bitte geben Sie mehrere Zahlen \n"
                  "durcheinander ein und trennen Sie diese \n"
                  "mit einem Komma")

        def clicked_button_slctn_sort(self):
            select_sort =self.entry1[""].get()

            for i in range(len(slctn_srt)):
                select_sort = str(i)
                min_index = i
                for j in range(i + 1, len(slctn_srt)):
                    if slctn_srt[min_index] > slctn_srt[j]:
                        min_index = j

                slctn_srt[i], slctn_srt[min_index] = slctn_srt[min_index], slctn_srt[i]

                print(select_sort)

if __name__ == "__main__":
    Surface()

    #print ("Sorted array")

    #print(A)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Traumkind: eingerückt wird einheitlich mit 4 Leerzeichen pro Ebene, nicht mal 4 und mal 8. __init__ ist dazu da, ein Objekt zu initialisieren, `mainloop` gehört da nicht rein. Wenn man anfängt Namen durchzunummerieren, hat man ein Problem, nämlich, dass man nicht genau weiß, für was ein Objekt da ist, weil man keinen passenden Namen gefunden hat. Dann passiert es auch mal, dass man einen Namen doppelt vergibt. Keine Abkürzungen, was soll denn slctn heißen? Ein Knopf der clicked heißt?
Konstanten schreibt man komplett groß: FIELD (wird aber gar nicht benutzt).

Zu den Problemen in `clicked_button_slctn_sort`:
Zeile 1: `selected_sort` wird definiert, in der for-Schleife aber gleich wieder überschrieben. Ein Entry hat keine Option "", weshalb hier das Programm abbricht.
Zeile 3: `slctn_srt` ist nicht definiert. Das wäre dann ein NameError.
Auch wenn die for-Schleife funktionieren würde, wird mit dem Ergebnis nichts gemacht.
Zum Sortieren gibt es list.sort, bzw. sorted.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Traumkind

Ich nehme an du möchtest die im Entry mit Komma getrennten eingegebenen Zeichen als Liste weiter verarbeiten?
Diese Zeile ist falsch:

Code: Alles auswählen

select_sort =self.entry1[""].get()
und muss dann wie folgt aussehen:

Code: Alles auswählen

entry_data = self.entry1.get()
entry_data_list = entry_data.split(',')
Die anderen Fehler hat dir schon Sirius3 bekannt gegeben.
Gruss wuf :-)
Take it easy Mates!
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Traumkind: Zusätzliche Anmerkungen: Die Kommentare sind allesamt überflüssig. Die sagen nur genau das was da bereits als Code steht, bieten dem Leser also gar keinen Mehrwert. Faustregel: Nicht kommentieren *was* der Code macht, denn das steht da ja bereits als Code, sondern *warum* er das so macht. Sofern das nicht offensichtlich ist.

Die `config()`-Aufrufe sind bis auf beim `Tk`-Objekt unnötig, weil man die Optionen auch direkt beim erstellen der jeweiligen Objekte hätte angeben können.

Neben dem was wuf bereits über das auslesen des Texteingabefelds und an Kommas aufteilen gesagt hat, möchtest Du die einzelnen Elemente dann noch tatsächlich in Zahlen umwandeln weil die Zeichenkette '10' sonst kleiner ist als die Zeichenkette '2', was als Sortierreihenfolge für Zahlen etwas überraschend wäre.

Das eigentliche sortieren gehört nicht in die GUI-Klasse sondern in eine Funktion die einfach nur sortiert, und die man auch ohne die GUI testen und verwenden kann. Also sofern es Dir tatsächlich darum geht „selection sort“ selbst zu implementieren, denn ansonsten haben Listen bereits eine (effizientere) `sort()`-Methode. Und es gibt die `sorted()`-Funktion wenn man eine Liste nicht verändern möchte aber eine sortierte (flache) Kopie benötigt. Oder auch wenn man keine Liste, sondern ein beliebiges iterierbares Objekt vorliegen hat.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk


def selection_sort(items):
    pass


class Surface:
    
    def __init__(self, parent):
        tk.Label(
            parent,
            text='Bitte geben Sie mehrere Zahlen durch Kommas getrennt ein',
            bg='skyblue',
            fg='green',
        ).pack()

        self.entry = tk.Entry(parent, text='', bg='green')
        self.entry.pack()

        self.label_1 = tk.Label(parent, text='')
        self.label_1.pack()

        tk.Button(parent, text='Hilfe', command=self.display_help).pack()

        self.label_2 = tk.Label(parent, text='')
        self.label_2.pack()

        tk.Button(parent, text='alle ausgeben', command=self.do_sort).pack()

    @staticmethod
    def display_help():
        # 
        # TODO Use `tkinter.messagebox.showinfo()` instead of printing to
        #   standard output.
        # 
        print(
            'Bitte geben Sie mehrere Zahlen\n'
            'durcheinander ein und trennen Sie diese\n'
            'mit einem Komma'
        )

    def do_sort(self):
        items = list(map(int, self.entry.get().split(',')))
        selection_sort(items)
        # 
        # TODO Display in the GUI instead of printing to standard output.
        # 
        print(', '.join(map(str, items)))


def main():
    root = tk.Tk()
    root.title('Selection Sort')
    root.geometry('400x200')
    root.config(bg='red')
    _surface = Surface(root)
    root.mainloop()
    

if __name__ == '__main__':
    main()
Ich hätte die Ausgabe der sortierten Elemente in der GUI ja gleich machen können – nur wusste ich nicht ob das in `label_1` oder in `label_2` landen soll. Schönes Beispiel warum solche nichtssagenden Namen keine gute Idee sind.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Traumkind
User
Beiträge: 3
Registriert: Freitag 30. November 2018, 15:31

Vielen lieben Dank.

Ich werde de Tipps beherzigen. Dankeschön. Es war am Anfang echt peinlich zu fragen, aber ich bereue es nicht. Dankeschön
Lg
Benutzeravatar
Marceline
User
Beiträge: 20
Registriert: Freitag 2. November 2018, 16:35

Kann jemand bitte kurz anreißen, wie man bei Selection Sort das stückweise Sortieren macht. Wir müssen den Spaß so implementieren, dass über tkinter die Sortierung nach Selection Short timer- und manuellgesteuert ermöglicht wird. Also das man die Zahlen hat und dann entweder automatisch vor dem Rechner vorgeführt bekommt, wie die einzelnen Umsortierungsprozesse aussehen und alternativ, dass man z.B. pro Klick auf einen Button einen Umsortierungsprozess erscheint, bis dann am Ende, nachdem man sich vollständig durchgegklickt hat, die komplette Sortierung von Selection Sort abgeschlossen ist.

Kann man da einfach mehrere print-befehle innerhalb von selection sort nehmen?
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Marceline: Wenn das per GUI passieren soll, dann nützt Dir ja `print()` nichts. Das einfachste wäre es die Sortierfunktion als Generatorfunktion zu implementieren die bei jedem Schritt die Informationen liefert, die man für die Anzeige des Schritts in der GUI benötigt. Da kann man dann entweder per Timer/`after()` die `next()`-Funktion mit dem Iterator als Argument aufrufen, oder das gleiche per klick auf eine Schaltfläche.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten