проблема в связывании меток tkinter в том случае, если их список составлен с использованием * - PullRequest
0 голосов
/ 02 апреля 2020

В чем разница между этими блоками кода? Первый приводит к тому, что все метки размещаются в последнем столбце, перекрывая друг друга. Заранее спасибо.

list_of_labels = [Label(root, text = '-')]*3
for i in range(len(list_of_labels)):
   list_of_labels.grid(row = 0, column = i)
#2.
list_of_labels = []
for i in range(3):
   list_of_labels.append(Label(root, text = '-'))
   list_of_labels[i].grid(row = 0, column = i)```


Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

В первом случае создается только одна метка. Список указывает на это три раза. Только последний grid() в столбце 2 активен после запуска mainloop.

import tkinter as tk 

root = tk.Tk()

labels0 = [tk.Label(root, text = 'Test')] * 3
# Creates ONE Label and references it 3 times!!
for i in range(len(labels0)):
    labels0[i].grid( row=0, column = i )

labels1 = []
# Creates 3 Labels and references each one once. 
for i in range(3):
    labels1.append( tk.Label(root, text = 'Test '+str(i)))
    labels1[i].grid( row=1, column=i )

print('Labels0: ', labels0 )
# Labels0:  [<tkinter.Label object .!label>, <tkinter.Label object .!label>, <tkinter.Label object .!label>]
# One Label referenced 3 times in the list

print('Labels1: ', labels1 )
# Labels1:  [<tkinter.Label object .!label2>, <tkinter.Label object .!label3>, <tkinter.Label object .!label4>]
# 3 different Labels 

root.mainloop()
0 голосов
/ 02 апреля 2020

Ваш первый код дела неверен:

list_of_labels = [Label(root, text = '-')]*3  # <-- create array of 3 items refer to same Label
for i in range(len(list_of_labels)):
   list_of_labels.grid(row = 0, column = i)  # <-- should be list_of_labels[i].grid(...)

Правильный код должен быть:

list_of_labels = [tk.Label(root, text = '-') for _ in range(3)]
for i in range(len(list_of_labels)):
   list_of_labels[i].grid(row = 0, column = i)

Примечание. Второй вариант кода является предпочтительным способом.

...