Я не уверен, почему вы используете exec
для создания ярлыка. Есть гораздо более безопасный способ сделать это, точно так же, как ваша raidiobutton.
Одна из ваших основных проблем - вы не используете i
, который вы определили в своей лямбде. Ничто не может быть обновлено, если вы не примените это значение к сетке.
Также этот код сразу уничтожает ваше поле ввода.
for i in self.winfo_children():
i.destroy()
Я немного почистил ваш пример и исправил лямбда-проблема.
Попробуйте это:
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('300x225')
self.title('dumb kid idiot test')
self.entry = tk.Entry(self)
self.var = tk.IntVar(self)
for i in range(8):
tk.Radiobutton(self, text=('class ' + str(i + 1)), variable=self.var, value=(i+1),
command=lambda i=i: self.entry.grid(row=i, column=4)).grid(row=i, column=1)
for i in range(8):
tk.Label(self, text='34').grid(row=i, column=3)
if __name__ == '__main__':
App().mainloop()
Вы также можете захотеть, чтобы функция / метод обрабатывал шанс сетки, на тот случай, если вы захотите, чтобы ваша кнопка выполняла другие действия при нажатии.
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('300x225')
self.title('dumb kid idiot test')
self.entry = tk.Entry(self)
self.var = tk.IntVar(self)
for i in range(8):
tk.Radiobutton(self, text=('class ' + str(i + 1)), variable=self.var, value=(i+1),
command=lambda i=i: self.move_entry(i)).grid(row=i, column=1)
for i in range(8):
tk.Label(self, text='34').grid(row=i, column=3)
def move_entry(self, ndex):
self.entry.grid(row=ndex, column=4)
if __name__ == '__main__':
App().mainloop()