Некорректная работа с tkinter.IntVar во вложенных функциях
Создаю небольшое GUI на tkinter в определённый момент надо создать массив tkinter.Сheckbutton и привязать их к массиву IntVar соответственно, привязка работает, но когда возникает необходимость считать их значения то метод .get() возвращает только 0.
Вот короткий скрипт работающий с аналогичными массивами:
import tkinter
W = tkinter.Tk()
Inteeger = [] # массив с IntVar
for i in range(3):
Inteeger.append(tkinter.IntVar())
ch = [] # массив с Checkbutton
for i in range(3):
check = tkinter.Checkbutton(W,textvariable = Inteeger[i] ,variable = Inteeger[i])
ch.append(check)
ch[-1].grid(row = i, column = 0)
def click(): # считает количество отмеченных флажков и выводит в консоль
sum = 0
for i in Inteeger:
sum += i.get()
print(sum)
btn = tkinter.Button(W, text = 'почему?', comman = click)
btn.grid(row = 3, column = 2)
W.mainloop()
Он работает корректно.
Но стоит вызвать окно с таким содержанием из другого окна, и метод .get() возвращает только 0.
Вот пример кода:
import tkinter
def def1():
W = tkinter.Tk()
Inteeger = [] # массив с IntVar
for i in range(3):
Inteeger.append(tkinter.IntVar())
ch = [] # массив с Checkbutton
for i in range(3):
check = tkinter.Checkbutton(W,textvariable = Inteeger[i] ,variable = Inteeger[i])
ch.append(check)
ch[-1].grid(row = i, column = 0)
def click(): # считает количество отмеченных флажков и выводит в консоль
sum = 0
for i in Inteeger:
sum += i.get()
print(sum)
btn = tkinter.Button(W, text = 'кнопка', comman = click)
btn.grid(row = 3, column = 2)
W.mainloop()
Window = tkinter.Tk()
btn = tkinter.Button(Window, text = 'кнопка', comman = def1)
btn.grid(row = 3, column = 2)
Window.mainloop()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте так:
from tkinter import Tk, Toplevel, Button, Label, IntVar, Checkbutton
def def1():
# W = tkinter.Tk()
top = Toplevel(root) # +++
Inteeger = [] # массив с IntVar
for i in range(3):
Inteeger.append(IntVar())
ch = [] # массив с Checkbutton
for i in range(3):
check = Checkbutton(top,textvariable = Inteeger[i] ,variable = Inteeger[i]) # top
ch.append(check)
ch[-1].grid(row = i, column = 0)
def click(): # считает количество отмеченных флажков и выводит в консоль
sum = 0
for i in Inteeger:
sum += i.get()
print(sum)
btn = Button(top, text = 'кнопка', comman = click) # top
btn.grid(row = 3, column = 2)
# W.mainloop()
root = Tk()
label = Label(root, text='Hello World')
label.pack()
btn = Button(root, text = 'openModal', comman=def1).pack()
root.mainloop()
