Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » функция-обработчик вызывается раньше, чем создается кнопка [RSS Feed]

#1 Ноя. 19, 2008 14:06:16

питекантроп
От:
Зарегистрирован: 2008-10-28
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

функция-обработчик вызывается раньше, чем создается кнопка

Реализовал класс для вывода создания окна с 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() отрабатывает раньше, чем создается само окно. кто-нибудь может объяснить такое поведение?



Отредактировано (Ноя. 19, 2008 14:26:01)

Офлайн

#2 Ноя. 19, 2008 15:10:26

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

функция-обработчик вызывается раньше, чем создается кнопка

Ну да… для создания окна требуется время. в то время, пока окно создается, у тебя спокойно вызывается твоя функция
А вот это что такое???

 self.button.bind(self.check(self,res,err))
к какому событию ты привязваешь функцию??
P.S. про тег CODE не забывай



Отредактировано (Ноя. 19, 2008 15:13:52)

Офлайн

#3 Ноя. 19, 2008 15:19:03

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

функция-обработчик вызывается раньше, чем создается кнопка

На сколько я помню, что бы не вызывалось сразу, можно оформить вызов через лямбду.

Офлайн

#4 Ноя. 19, 2008 15:25:45

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

функция-обработчик вызывается раньше, чем создается кнопка

Ferroman
На сколько я помню, что бы не вызывалось сразу, можно оформить вызов через лямбду.
И это верно.. да и event нужно указать обязательно



Офлайн

#5 Ноя. 19, 2008 15:29:37

питекантроп
От:
Зарегистрирован: 2008-10-28
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

функция-обработчик вызывается раньше, чем создается кнопка

igor.kaist
Ну да… для создания окна требуется время. в то время, пока окно создается, у тебя спокойно вызывается твоя функция
мне не понятно, почему она вообще вызывается..

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

по нажатию на кнопку вообще ничего не происходит.. )



Офлайн

#6 Ноя. 19, 2008 15:35:47

питекантроп
От:
Зарегистрирован: 2008-10-28
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

функция-обработчик вызывается раньше, чем создается кнопка

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

теперь функция сама по себе не вызывается, но при нажатии на кнопку выводится сообщение об ошибке:
“TypeError: <lambda>() takes no arguments (1 given)”



Офлайн

#7 Ноя. 19, 2008 15:40:33

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

функция-обработчик вызывается раньше, чем создается кнопка

ну тут уж нужно почитать немного доки, про то, что такое lambda.
1. когда ты в классе вызываешь функцию, self указывать не надо
2. lambda функции как и обычной функции нужно передовать параметры
lambda res,err:self.check(res,err)



Офлайн

#8 Ноя. 19, 2008 16:08:00

питекантроп
От:
Зарегистрирован: 2008-10-28
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

функция-обработчик вызывается раньше, чем создается кнопка

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

перепробовал несколько вариантов, в какой-то момент он даже начинает говорить: “AttributeError: Event instance has no attribute ‘__len__’”



Офлайн

#9 Ноя. 19, 2008 17:23:00

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

функция-обработчик вызывается раньше, чем создается кнопка

Привет. Вот так работает:

#!/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 хитрый вызов обработчика :)



Офлайн

#10 Ноя. 19, 2008 19:39:02

питекантроп
От:
Зарегистрирован: 2008-10-28
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

функция-обработчик вызывается раньше, чем создается кнопка

спасибо, братан!



Офлайн

  • Начало
  • » GUI
  • » функция-обработчик вызывается раньше, чем создается кнопка[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version