int() Fehler Entry

Fragen zu Tkinter.
Antworten
nb5code
User
Beiträge: 23
Registriert: Freitag 13. März 2015, 18:20

Hallo tkinter Begeisterte,
ich habe einen schwerwiegenden Fehler in meinem Programm, welcher meiner Meinung nach von mir nicht Lösbar ist.
Zur Theorie:
Ich möchte ein Programm schreiben, welches Zahlen,die der Nutzer eingibt, aus einem Entry bezieht und dann nach Bubblesort Prinzip sortiert.
Die Sortierte Liste soll anschließend,vorerst, in der konsole ausgegeben werden.
mein Problem ist es, dass ich die Elemente im String nicht zu einem integer formatieren kann, was für die Weiterarbeit sehr wichtig ist.

Ich würde mich sehr freuen wenn ihr mir vielleicht Lösungsvorsachläge unter diesen Post schicken könntet, damit ich Hausarbeit, welche als Klausur zählt weiter machen kann.

LG

Nick B.

Code: Alles auswählen

from tkinter import *

def show_entry_fields():
    print("Liste: %s" % (e1.get()))

def create_list(liste):
    liste=(e1.get())
    print(liste)
    
def exchange():
    liste=e1.get() 
    liste.split(",")
    l=int(liste)

    for length in range(len(l)-1,0,-1):
        for i in range(length):
            if l[i] > l[i+1]:
                temp = l[i] 
                l[i]=l[i+1] 
                l[i+1]=temp
                print("Success")
        length =-1
        print(l)
        
master = Tk()
Label(master, text="Liste: ").grid(row=0)

e1 = Entry(master)
e1.grid(row=0, column=1)

Button(master, text='Quit', command=master.quit).grid(row=3, column=0, sticky=W, pady=4)
Button(master, text='Show', command=show_entry_fields).grid(row=3, column=1, sticky=W, pady=4)
Button(master, text='Mach', command=exchange).grid(row=3, column=2, sticky=W, pady=4)

mainloop( )

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
    return self.func(*args)
  File "C:\IT\Python\Bubblesort\src\program.py", line 31, in exchange
    l=int(liste)
ValueError: invalid literal for int() with base 10: '1,6,4,2'
Sirius3
User
Beiträge: 18294
Registriert: Sonntag 21. Oktober 2012, 17:20

@nb5code: da bin ich anderer Meinung. Was soll denn die create_liste-Funktion und was das Argument? In Python sind Strings unveränderbar. split liefert daher eine Liste zurück und die int-Funktion kann nur auf Strings und nicht auf Listen angewendet werden. l ist ein sehr sehr schlechter Name für eine Variable, da sie nichts aussagt und zudem noch leicht mit I oder 1 zu verwechseln ist. Was denkst Du, hat Zeile 22 für Auswirkungen?
BlackJack

@nb5code: Du solltest die GUI von der Programmlogik trennen. Konkret heisst das hier das das sortieren in einer eigenen Funktion stehen sollte die nichts mit der GUI zu tun hat. Also weder Daten aus Eingabefeldern liest noch welche ausgibt, weder in die GUI noch auf der Konsole. Diese Funktion solltest Du testen. Erst wenn das funktioniert, macht es Sinn da eine GUI drauf zu setzen. Immer ein Problem nach dem anderen lösen und testen ob die Teillösung bis dahin funktioniert. Sonst hat man am Ende zu viele Enden an denen gleichzeitig gebastelt und repariert werden muss.

Das Umwandeln einer Zeichenkette mit Ziffernfolgen und Kommata in eine Liste mit Zahlen kann man auch in einer Funktion schreiben die nichts mit Benutzerinteraktion zu tun hat und die man einzeln testen kann, bis sie funktioniert.
nb5code
User
Beiträge: 23
Registriert: Freitag 13. März 2015, 18:20

soooo ich habe den fehler selber gefunden gibt es noch irgentwelche anmerkungen was man an diesem programm noch verbessern könnte?
ein label, dass in der gui angezeigt wird folgt noch !

Code: Alles auswählen

from tkinter import *

def show_entry_fields():
    print("Liste: %s" % (e1.get()))

def exchange():
    liste=e1.get().split(',')
    for length in range(len(liste)-1,0,-1):
        for i in range(length):
            if liste[i] > liste[i+1]:
                temp = liste[i] 
                liste[i]=liste[i+1] 
                liste[i+1]=temp
                print("Success 1!")
            elif liste[i]<liste[i+1]:
                print("Success 2!")
            else:
                print("Failed!")
        length =-1
    print(liste)
        
        
master = Tk()
Label(master, text="Liste: ").grid(row=0)

e1 = Entry(master)
e1.grid(row=0, column=1)

Button(master, text='Quit', command=master.quit).grid(row=3, column=0, sticky=W, pady=4)
Button(master, text='Show', command=show_entry_fields).grid(row=3, column=1, sticky=W, pady=4)
Button(master, text='Mach', command=exchange).grid(row=3, column=2, sticky=W, pady=4)

mainloop( )
Sirius3
User
Beiträge: 18294
Registriert: Sonntag 21. Oktober 2012, 17:20

@nb5code: ist das Dein Ernst? Wenn Du etwas von BlackJacks Ausführungen nicht verstehst, kannst Du nachfragen.
nb5code
User
Beiträge: 23
Registriert: Freitag 13. März 2015, 18:20

mein Fehler ist jetzt noch , dass ich keine 2 oder mehrtelligen zahlen richtig konvertiert bekomme

@BlackJack: wie soll ich denn die gui von der methode trennen,außerdem habe ich die Bubblesort methode davor zusammengebaut und genau wie di gesagt hast danach eine gui drüber gelegt.
anbei letzte speicherung und rohmethode

Code: Alles auswählen

def exchange(liste):
    for length in range(len(liste)-1,0,-1):
        for i in range(length):
            if liste[i] > liste[i+1]:
                temp = liste[i]
                liste[i]=liste[i+1]
                liste[i+1]=temp
                print("Success")
        length =-1
liste=[5,4,3,8,7,55,9,6,2,33,1,10]
exchange(liste)
print(liste)
rohdatei funktioniert einwandfrei

Code: Alles auswählen

from tkinter import *

def show_entry_fields():
    listshow="Liste(unsortiert): " + (e1.get())
    listshowlbl=Label(master,text=listshow).grid(row=3,column=1)

def exchange():
    liste=e1.get().split(',')
    for length in range(len(liste)-1,0,-1):
        for i in range(length):
            if liste[i] > liste[i+1]:
                temp = liste[i] 
                liste[i]=liste[i+1] 
                liste[i+1]=temp
                print("Success 1!")
            elif liste[i]<liste[i+1]:
                print("Success 2!")
            else:
                print("Failed!")
        length =-1
    listesortiert="Sortiert: {}".format(liste)
    listelbl=Label(master,text=listesortiert).grid(row=2,column=1)
                                                
        
        
master = Tk()
Label(master, text="Liste: ").grid(row=0)

e1 = Entry(master)
e1.grid(row=0, column=1)

Button(master, text='Quit', command=master.quit).grid(row=4, column=0, sticky=W, pady=4)
Button(master, text='Show list', command=show_entry_fields).grid(row=4, column=1, sticky=W, pady=4)
Button(master, text='Bubble it!', command=exchange).grid(row=4, column=2, sticky=W, pady=4)

mainloop( )
nb5code
User
Beiträge: 23
Registriert: Freitag 13. März 2015, 18:20

@BlackJack: ?
BlackJack

@nb5code: Trennen in dem Du die `exchange()`-Funktion eben nicht mehr veränderst sondern so benutzt wie sie ist. Der GUI-Code kann die doch aufrufen. Und in die Funktion gehört kein `print()`, das vermischt dann ja wieder Programmlogik und Benutzerinteraktion.

Wie kommt man auf den Namen `exchange()` für eine Funktion die eigentlich ein Bubblesort sein soll?
Antworten