python:tkinter exec NameError

img

img

问题出现在save函数中,我直接运行会在exec ('event' + str (times) + '.destroy ()')中报错NameError: name 'event0' is not defined,我又尝试把exec换掉,直接用原语句的第一个变量event0使用控件,不报错了说明原语句生成的变量不是event0,可在exec ('event' + str (times) + '.destroy ()')中它又能去找event0,不知道问题出在哪里。

我又测试一下:用exec好像可以创建连续变量并可以对其作出改变,那为什么之前不行呢,是不是tkinter的问题

for i in range (5):

exec ('list' + str (i) + ' = [45,46]')

exec ('list' + str (i) + '.append (46 + ' + str (i) + ')' )

print (list0)

print (list1)

print (list2)

print (list3)

print (list4)

求援助!

副代码:

import tkinter

def add ():

global text_entry, save_button

text_entry = tkinter.Entry (main_window)
text_entry.place (x = 70, y = 10, width = 500, height = 30)

save_button = tkinter.Button (main_window, text = 'save_button', command = lambda: save (text_entry.get ()))
save_button.place (x = 580, y = 10, width = 50, height = 30)

def save (text):

global event_list, event_y, event0

text_entry.destroy ()
save_button.destroy ()

for times in range (0, len (event_list), 1):
exec ('event' + str (times) + '.destroy ()')

time.sleep (2)
event_list.append (text)

for times in range (0, len (event_list), 1):

print (str (times))

exec ('event' + str (times) + ' = tkinter.Button (main_window, text = event_list [' + str (times) + '], command = lambda: delete (' + str (times) + '))')
exec ('event' + str (times) + '.place (x = 10, y = ' + str (event_y) + ', width = 620, height = 30)')

#event0 = tkinter.Button (main_window, text = event_list [times], command = lambda: delete (times))
#event0.place (x = 10, y = event_y, width = 620, height = 30)

event_y = event_y + 50

event_y = 50

def delete (times):
print (times)

event_list = []
event_y = 50

main_window = http://tkinter.Tk ()
main_window.title ('main_window')
main_window.geometry ('640x200')
#main_window.resizable (0, 0)

add_button = tkinter.Button (main_window, text = 'add_button', command = add)
add_button.place (x = 10, y = 10, width = 50, height = 30)

main_window.mainloop ()

save函数中
global event_list, event_y, event0
只声明了event0为全局变量
用 exec ('event' + str (times) + ' = tkinter.Button (main_window, text = event_list [' + str (times) + '], command = lambda: delete (' + str (times) + '))')
创建的event1、event2都是函数内的局部变量。出了函数就被销毁了。

你不要用exec创建变量,应该用一个列表来保存所有的tkinter.Button对象