Форум сайта python.su
Здравствуйте! Новичок. не могу разобраться, как реализовать следующую идею по написанию приложения в tkinter (и возможно ли это вообще в такой логической реализации) идея следующая (показываю сокращенно) list_main =[quote][][quote] def xxx(): for x in range(1,20): для примера взят range (в программе около 30 итераций) несколько полей Entry и label a = Entry() b = Entry() list =[quote][a,b][/quote] Button(command = lambda a=list : y(a) ) def y(a): d = a[0].get() c = a[1].get() list_main.append(d) list_main.append(c) вопрос: как сделать так, чтобы цикл останавливался на кнопке и продолжался после ее нажатия?
Отредактировано Ivansr (Июнь 8, 2019 20:17:37)
Офлайн
Ivansr вы подходите не с той стороны, tkinter событийно ориентированая библиотекаи работать нужно в ней стоветвенно.
def btn_click(): list_main.append([a.get(), b.get()]) root = tkinter.Tk() a = Entry() b = Entry() Button(command = btn_click ) root.mainloop()
[code python][/code]
Отредактировано PEHDOM (Июнь 8, 2019 21:09:34)
Офлайн
PEHDOMя так и делал для одного события. Это понятно.
Ivansr вы подходите не с той стороны, tkinter событийно ориентированая библиотекаи работать нужно в ней стоветвенно.
Офлайн
Ivansrа старые поля и кнопка куда деваються? они должны оставаться? тога като так:
затем создаются новые поля для заполнения снова с кнопкой снятия данных
def btn_click(): Global count list_main.append([a[count].get(), b[count].get()]) count+=1 a.append(Entry()) b.append(Entry()) btn.append(Button(command = btn_click )) root = tkinter.Tk() a, b, btn = [],[],[] count = 0 a.append(Entry()) b.append(Entry()) btn.append(Button(command = btn_click )) root.mainloop()
[code python][/code]
Отредактировано PEHDOM (Июнь 8, 2019 21:38:17)
Офлайн
старые поля по замыслу стираются и на их месте появляются новые в цикле в том же окне Toplevel()
list = wnd2.grid_slaves()
for l in list:
l.destroy()
пробовал вставлять функцию окно2.wait_variable(список снятия данных), ожидая, что цикл продолжит работу и выведет новые поля после удаления старых, но программа не возвращается потом на тоже место в цикле.
не понял до конца как работает.
попробую Ваш вариант как то пристроить
если есть время, посмотрите эти две функции:
def choice_progr(con,cur,stng,root,wnd2,m,lst):
# получение результатов предыдущего окна (весов гирь)
lst2 =
for xx in lst:
a = xx.get()
lst2.append(a)
wh,wl,n = ,,lst2
if lst2 == 1: wh.append(32)
if lst2 == 1: wh.append(28)
if lst2 == 1: wh.append(24)
if lst2 == 1: wl.append(20)
if lst2 == 1: wl.append(18)
if lst2 == 1: wl.append(16)
# обнуление вспомогательного окна
list = wnd2.grid_slaves()
for l in list:
l.destroy()
# отработка нового окна
progr = {}
with open('plan_workout.json') as fl:
progr_before = json.load(fl)# загрузка словаря предыдущего цикла
x = 0 # ряд в grid
for listEx_id in stng.list_exx():# цикл для каждого упражнения (их 30)
txt2 = ff.full_name(con, cur, listEx_id) # получает имя упр
m.lbl_3(wnd2,txt2,x,0,6,1)# выводит имя упр
x=x+1
if listEx_id in stng.list_ex_ket_wh: # цикл для гиревых упр
for y in wh:
w=y
b = data_ex(listEx_id,progr_before,w,con,cur,stng)
ms = show_result_before(listEx_id,con,cur,w,stng)
txt2 = str(y) + ‘ кг’
m.lbl_3(wnd2,txt2,x,0,1,1)
m.lbl_3(wnd2,'60%',x,1,1,1)
b1 = m.entry_1(wnd2,b,x,2)
m.lbl_3(wnd2,'80%',x,3,1,1)
b2 = m.entry_1(wnd2,b,x,4)
m.lbl_3(wnd2,'100%',x,5,1,1)
b3 = m.entry_1(wnd2,b,x,6)
x=x+1
m.lbl_3(wnd2,ms,x,0,6,1)
x=x+1
list_ex=
m.btn_3(wnd2,'Ok',lambda a=progr,b=list_ex,c=wnd2,d=m :
save_ex(a,b,c,d),4,x,4,1,1)
print('цикл остановился')
wnd2.wait_variable(list_ex)
print('цикл работает') — это сообщение не выводится
x=+1
def save_ex(progr,list_ex,wnd2,m):
# сохраняет данные по упр в словарь
listEx_id, w = list_ex, list_ex
b1 = list_ex.get()
b2 = list_ex.get()
b3 = list_ex.get()
progr =
#wnd2.destroy()
list = wnd2.grid_slaves()
for l in list:
l.destroy()
— после этого момента не возвращается к циклу
Отредактировано Ivansr (Июнь 8, 2019 21:52:33)
Офлайн
Ivansrхмм тогда вообще не понимаю, зачам
старые поля по замыслу стираются и на их месте появляются новые в цикле в том же окне
def btn_click(): list_main.append([a.get(), b.get()]) a.delete(0, 'end') b.delete(0, 'end') root = tkinter.Tk() a = Entry() b = Entry() Button(command = btn_click ) root.mainloop()
Ivansrкод нечитаем , используйте теги
если есть время, посмотрите эти две функции:
[code python][/code]
[code python][/code]
Отредактировано PEHDOM (Июнь 8, 2019 22:44:04)
Офлайн
спасибо! Предложение с счетчиком (переменная count), оказалось на удивление простым и работоспособным, вместо цикла for для данного случая.
Офлайн