Почему python показывает только первую половину списка в tkinter? - PullRequest
0 голосов
/ 27 февраля 2020

Я попытался написать программу, которая показывает список целых чисел в таблице в новом окне tkinter нажатием кнопки. После запуска показалась только первая половина списка, но ошибок не было. Я попытался удвоить тело for-l oop, но пропало одно при неравном числе целых чисел в списке и два при четном. Вот отдельная проблема:

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()

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Потому что, когда вы выдвигаете одно из чисел, список, через который перебирается i, становится короче, поэтому он заканчивается рано. Также вместо использования x в качестве отдельной переменной для отслеживания итераций вы можете использовать enumerate. Делая это, и не выталкивая номер, просто отображая его, исправляет вашу проблему:

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()
0 голосов
/ 27 февраля 2020

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)
0 голосов
/ 27 февраля 2020

Здесь я создал 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...