питекантроп
Ноя. 19, 2008 14:06:16
Реализовал класс для вывода создания окна с 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
Ноя. 19, 2008 15:10:26
Ну да… для создания окна требуется время. в то время, пока окно создается, у тебя спокойно вызывается твоя функция
А вот это что такое???
self.button.bind(self.check(self,res,err))
к какому событию ты привязваешь функцию??
P.S. про тег CODE не забывай
Ferroman
Ноя. 19, 2008 15:19:03
На сколько я помню, что бы не вызывалось сразу, можно оформить вызов через лямбду.
igor.kaist
Ноя. 19, 2008 15:25:45
Ferroman
На сколько я помню, что бы не вызывалось сразу, можно оформить вызов через лямбду.
И это верно.. да и event нужно указать обязательно
питекантроп
Ноя. 19, 2008 15:29:37
igor.kaist
Ну да… для создания окна требуется время. в то время, пока окно создается, у тебя спокойно вызывается твоя функция
мне не понятно, почему она вообще вызывается..
igor.kaist
к какому событию ты привязываешь функцию??
событие <Button>
по нажатию на кнопку вообще ничего не происходит.. )
питекантроп
Ноя. 19, 2008 15:35:47
Ferroman
На сколько я помню, что бы не вызывалось сразу, можно оформить вызов через лямбду.
спасибо, сделал так: self.button.bind(“<Button>”, lambda :self.check(self,res,err))
теперь функция сама по себе не вызывается, но при нажатии на кнопку выводится сообщение об ошибке:
“TypeError: <lambda>() takes no arguments (1 given)”
igor.kaist
Ноя. 19, 2008 15:40:33
ну тут уж нужно почитать немного доки, про то, что такое lambda.
1. когда ты в классе вызываешь функцию, self указывать не надо
2. lambda функции как и обычной функции нужно передовать параметры
lambda res,err:self.check(res,err)
питекантроп
Ноя. 19, 2008 16:08:00
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
Ноя. 19, 2008 17:23:00
Привет. Вот так работает:
#!/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 хитрый вызов обработчика :)