Найти - Пользователи
Полная версия: функция-обработчик вызывается раньше, чем создается кнопка
Начало » GUI » функция-обработчик вызывается раньше, чем создается кнопка
1
питекантроп
Реализовал класс для вывода создания окна с 1-5 чекбоксами (в зависимости от длины списка-входного параметра ):

# -*- coding: cp1251 -*-
from Tkinter import *
from sys import *

class TK:
def __init__(self):
self.root = Tk()
self.flags =
self.flag1 = IntVar()
self.flag2 = IntVar()
self.flag3 = IntVar()
self.flag4 = IntVar()
self.flag5 = IntVar()
self.flags.append(self.flag1)
self.flags.append(self.flag2)
self.flags.append(self.flag3)
self.flags.append(self.flag4)
self.flags.append(self.flag5)

self.arr =
self.checkbutton1 = Checkbutton(self.root,variable = self.flag1)
self.checkbutton2 = Checkbutton(self.root,variable = self.flag2)
self.checkbutton3 = Checkbutton(self.root,variable = self.flag3)
self.checkbutton4 = Checkbutton(self.root,variable = self.flag4)
self.checkbutton5 = Checkbutton(self.root,variable = self.flag5)

self.arr.append(self.checkbutton1)
self.arr.append(self.checkbutton2)
self.arr.append(self.checkbutton3)
self.arr.append(self.checkbutton4)
self.arr.append(self.checkbutton5)

def SER(self,res,err):
for i in range(0,len(res)):
self.arr = res
self.arr.select()
self.arr.pack()
self.button = Button(self.root)
self.button= 10
self.button= “OK”
self.button.bind(self.check(self,res,err))
self.button.pack()
self.root.title(u'Ожидаемые результаты')

def check(self,event, res,err):
for i in range(0,len(res)):
if self.flags.get() == 1:
print err


res =

res.append(“qwe1qwe1qwe1qwe1”)
res.append('qwe2qwe2qwe2qwe2')
res.append('qwe3qwe3qwe3qwe3')
res.append('qwe4qwe4qwe4qwe4')
res.append('qwe5qwe5qwe5qwe5')

err =

err.append('QWE1')
err.append('QWE2')
err.append('QWE3')
err.append('QWE4')
err.append('QWE5')

n = TK()
n.SER(res,err)
n.root.mainloop()


проблема в том, что функция check() отрабатывает раньше, чем создается само окно. кто-нибудь может объяснить такое поведение?
igor.kaist
Ну да… для создания окна требуется время. в то время, пока окно создается, у тебя спокойно вызывается твоя функция
А вот это что такое???
 self.button.bind(self.check(self,res,err))
к какому событию ты привязваешь функцию??
P.S. про тег CODE не забывай
Ferroman
На сколько я помню, что бы не вызывалось сразу, можно оформить вызов через лямбду.
igor.kaist
Ferroman
На сколько я помню, что бы не вызывалось сразу, можно оформить вызов через лямбду.
И это верно.. да и event нужно указать обязательно
питекантроп
igor.kaist
Ну да… для создания окна требуется время. в то время, пока окно создается, у тебя спокойно вызывается твоя функция
мне не понятно, почему она вообще вызывается..

igor.kaist
к какому событию ты привязываешь функцию??
событие <Button>

по нажатию на кнопку вообще ничего не происходит.. )
питекантроп
Ferroman
На сколько я помню, что бы не вызывалось сразу, можно оформить вызов через лямбду.
спасибо, сделал так: self.button.bind(“<Button>”, lambda :self.check(self,res,err))

теперь функция сама по себе не вызывается, но при нажатии на кнопку выводится сообщение об ошибке:
“TypeError: <lambda>() takes no arguments (1 given)”
igor.kaist
ну тут уж нужно почитать немного доки, про то, что такое lambda.
1. когда ты в классе вызываешь функцию, self указывать не надо
2. lambda функции как и обычной функции нужно передовать параметры
lambda res,err:self.check(res,err)
питекантроп
igor.kaist
lambda функции как и обычной функции нужно передовать параметры
lambda res,err:self.check(res,err)
на такой вызов он ругается “TypeError: <lambda>() takes 2 arguments (1 given)”

перепробовал несколько вариантов, в какой-то момент он даже начинает говорить: “AttributeError: Event instance has no attribute ‘__len__’”
gmorgunov
Привет. Вот так работает:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
from sys import *

class TK:
def __init__(self):
self.root = Tk()
self.flags = []
self.flag1 = IntVar()
self.flag2 = IntVar()
self.flag3 = IntVar()
self.flag4 = IntVar()
self.flag5 = IntVar()
self.flags.append(self.flag1)
self.flags.append(self.flag2)
self.flags.append(self.flag3)
self.flags.append(self.flag4)
self.flags.append(self.flag5)

self.arr = []
self.checkbutton1 = Checkbutton(self.root,variable = self.flag1)
self.checkbutton2 = Checkbutton(self.root,variable = self.flag2)
self.checkbutton3 = Checkbutton(self.root,variable = self.flag3)
self.checkbutton4 = Checkbutton(self.root,variable = self.flag4)
self.checkbutton5 = Checkbutton(self.root,variable = self.flag5)

self.arr.append(self.checkbutton1)
self.arr.append(self.checkbutton2)
self.arr.append(self.checkbutton3)
self.arr.append(self.checkbutton4)
self.arr.append(self.checkbutton5)

def SER(self,res,err):
for i in range(0,len(res)):
self.arr[i]["text"] = res[i]
self.arr[i].select()
self.arr[i].pack()
self.button = Button(self.root)
self.button["width"]= 10
self.button["text"]= "OK"
self.button.bind("<Button>",self.check) ############# ТУТЬ ##################
self.button.pack()
self.root.title(u'Ожидаемые результаты')

def check(self,event): ############ И ТУТЬ #################
for i in range(0,len(res)):
if self.flags[i].get() == 1:
print err[i]


res = []

res.append("qwe1qwe1qwe1qwe1")
res.append('qwe2qwe2qwe2qwe2')
res.append('qwe3qwe3qwe3qwe3')
res.append('qwe4qwe4qwe4qwe4')
res.append('qwe5qwe5qwe5qwe5')

err = []

err.append('QWE1')
err.append('QWE2')
err.append('QWE3')
err.append('QWE4')
err.append('QWE5')

n = TK()
n.SER(res,err)

n.root.mainloop()
… Там в доках Tkinter хитрый вызов обработчика :)
питекантроп
спасибо, братан!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB