为什么python只在tkinter中显示列表的前半部分



我试图编写一个程序,通过按下按钮在新的tkinter窗口中显示表中的整数列表。在我运行它时,只显示了列表的前半部分,但没有显示任何错误。我试图将for循环的主体加倍,但缺少了一个位于列表整数不均处的循环和两个位于偶数处的循环。这是一个孤立的问题:

from tkinter import * 
def table():
filewin = Toplevel(root)
x = 1
numbers = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
for i in numbers:
Label(filewin, text = ("Value", x, ":")).grid(column = 0, row = i)
Label(filewin, text = (liste.pop(0),"cm")).grid(column = 1, row = i)
x += 1

root = Tk()
Button(root, text = 'show list', command = table).pack()
root.mainloop()

因为当您弹出其中一个数字时,i正在迭代的列表会变短,这就是它提前终止的原因。此外,您可以使用enumerate,而不是使用x作为单独的变量来跟踪迭代。这样做,而不是弹出数字,只是显示它,解决了你的问题:

from tkinter import * 
def table():
filewin = Toplevel(root)
numbers = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
for i,number in enumerate(numbers):
Label(filewin, text = ("Value", i+1, ":")).grid(column = 0, row = i)
Label(filewin, text = (number,"cm")).grid(column = 1, row = i)

root = Tk()
Button(root, text = 'show list', command = table).pack()
root.mainloop()

liste.pop(0)删除列表的第一个值。你可能不想那样做。我认为你应该使用enumerate():

def table():
filewin = Toplevel(root)
numbers = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
for i, n in enumerate(numbers):
Label(filewin, text = ("Value", i + 1, ":")).grid(column = 0, row = i)
Label(filewin, text = (n, "cm")).grid(column = 1, row = i)

在这里,我创建了liste作为numbers的独立副本。如果您使用相同的列表,那么您将只打印一半的列表,因为您在每次迭代中从列表中pop一个元素。

from tkinter import * 
def table():
filewin = Toplevel(root)
x = 1
numbers = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
liste = numbers.copy()
for i in numbers:
Label(filewin, text = ("Value", x, ":")).grid(column = 0, row = i)
Label(filewin, text = (liste.pop(0),"cm")).grid(column = 1, row = i)
x += 1
root = Tk()
Button(root, text = 'show list', command = table).pack()
root.mainloop()

最新更新