Python: Tkinter: динамически создавать метки - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь создать ярлык динамически, получаю неверный синтаксис. Можете ли вы помочь мне, что я пропускаю или любую альтернативу

      crsr = cnxn.execute(query)
        row_num=2
        column_num=0
        Variable_Number=1
        for row in crsr.fetchall():

            test='Column_Label'+str(Variable_Number)+' = tk.Label(frame,text="'+row[0]+'")'



#proper Indentation availabe in code        test1='Column_Label'+str(Variable_Number)+'.grid(row='+str(row_num)+',column='+str(column_num)+')'
            eval(test+';'+test1)
    #        eval(test1)
            row_num+=1
            column_num+=1
        root.update_idletasks()

Ответы [ 2 ]

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

Вы не должны использовать exec. Если вы хотите связать вычисленное имя с виджетом в al oop, используйте словарь:

labels = {}
varnum = 0
for row in crsr.fetchall():
    name=f"label#{varnum}"
    labels[name] = tk.Label(frame, text=str(row[0]))
    labels[name].grid(row=row_num, column=column_num
    varnum += 1
    row_num+=1
    column_num+=1

Если вам неважно, какое это имя, вы можете сохранить виджеты в списке вместо словаря, а затем ссылаться на них, используя целочисленный индекс (например: labels[0], labels[1], et c).

0 голосов
/ 01 февраля 2020

Используйте exe c () вместо eval ()

eval будет оценивать выражение, а не запускать его так, как вы хотите. Думайте о eval как о аргументе оператора if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...