Ich bin ganz neu bei Python und habe die anderen Antworten auf diese Frage nicht verstanden. Warum konvertiert int(weight[0])
die Variable "weight" nicht in eine Ganzzahl, wenn ich meinen Code ausführe? Versuchen Sie Ihr Bestes, um es zu verdummeln, denn ich bin wirklich neu und verstehe das meiste immer noch nicht ganz. Hier ist der relevante Abschnitt meines Codes
weight = (lb.curselection())
print ("clicked")
int(weight[0])
print (weight)
print (type(weight))
und hier ist mein Code für dieses Skript
lb = Listbox(win, height=240)
lb.pack()
for i in range(60,300):
lb.insert(END,(i))
def select(event):
weight = (lb.curselection())
print ("clicked")
int(weight[0])
print (weight)
print (type(weight))
lb.bind("<Double-Button-1>", select)
Vielen Dank
Wenn ich den Code starte, kommt TypeError: int() argument must be a string, a bytes-like object or a number, not 'Tuple'
Und ich möchte, dass stattdessen die Variable "weight" in eine Ganzzahl umgewandelt wird, sodass ich sie für mathematische Operationen verwenden kann.
Vollständiges Traceback: Traceback (most recent call last):
File "C:\Users\Casey\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1699, in __call__
return self.func(*args)
File "C:/Users/Casey/AppData/Local/Programs/Python/Python36-32/s.py", line 11, in select
int(weight)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'Tuple'
was Sie suchen, ist
weight = int(weight[0])
int
ist eine Funktion, die liefert eine Ganzzahl, daher müssen Sie diese Rückgabe einer Variablen zuweisen.
wenn Sie die Variable weight
mit dem Wert des ersten Datensatzes neu zuweisen möchten, sollte dieser Code für Sie funktionieren.
Wenn das Element bereits eine ganze Zahl ist, kann der Aufruf int
möglicherweise redundant sein
weight = weight[0]
Ich habe bemerkt, dass Sie hier lb.bind("<Double-Button-1>", select)
verwendet haben. Dadurch wird das Problem mit curselection()
umgangen, wobei das zuletzt ausgewählte Listenelement zurückgegeben wird. Ich würde jedoch sagen, dass die Verwendung von lb.bind('<<ListboxSelect>>', select)
besser wäre. Das Binden an <<ListboxSelect>>
funktioniert, da dieses Ereignis ausgelöst wird, nachdem die Auswahl geändert wurde. Wenn Sie stattdessen curselection()
mit diesem Ereignis aufrufen, erhalten Sie die richtige Ausgabe, nach der Sie suchen.
Hier ist ein bisschen Code, der ein Beispiel für die Verwendung des <<ListboxSelect>>
-Ereignisses bietet:
import tkinter as tk
class Application(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
self.lb = tk.Listbox(self.parent, height=4)
self.lb.pack()
self.lb.bind('<<ListboxSelect>>', self.print_weight)
for item in ["one: Index = 0", "two: Index = 1", "three: Index = 2", "four: Index = 3"]:
self.lb.insert("end", item)
def print_weight(self, event = None):
# [0] gets us the 1st indexed value of the Tuple so weight == a number.
weight = self.lb.curselection()[0]
print(weight)
if __== "__main__":
root = tk.Tk()
app = Application(root)
root.mainloop()
Sie werden feststellen, dass der Ausdruck in der Konsole das aktuell ausgewählte Element mit einem einzigen Klick ist. Dadurch wird ein Doppelklick vermieden.