Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 17, 2016 20:02:45

Quazar
Зарегистрирован: 2016-01-17
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Возврат значения из функции

Добрый вечер!
Сейчас изучаю “tkinter” по этому поводу вопрос, вот простенькая программа:

from tkinter import *
root = Tk()
root.title('Fecha')
root.minsize(216, 300)
yy=10
def event1(a):
	a= a+1
	lb_y.config(text=a)
	return a
fr_kal=Frame(root, bg='DeepSkyBlue4', bd=1, relief=RIDGE)  
fr_kal.pack(expand=YES, fill=BOTH) 
lb_y=Label(fr_kal, font='FreeMono 10 bold', bg='DeepSkyBlue4', fg='white')
lb_y.place(x=85, y=1)
but_ok=Button(fr_kal,text='OK', cursor='hand2', bg='cyan')
but_ok.place(x=82, y=260, width=50, height=24) 
but_ok.bind('<Button-1>', lambda event: event1(yy)) 
lb_y.config(text=yy)
root.mainloop()

Хочу сделать что бы при нажатии кнопки функция меняла глобальную переменную “yy”, но нехочу задейсвовать ее в самой функции (т.к. везде советуют не использовать глобальные переменные в функциях). Пробовал так - “but_ok.bind('<Button-1>', lambda event: yy=event1(yy))” не прокатило…
Как сделать чтобы event работал как обычная функция с возвратом результата?

Офлайн

#2 Янв. 17, 2016 20:28:22

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Возврат значения из функции

Используйте ООП. Сразу все станет проще и понятнее.

from tkinter import Tk, Button, Label, IntVar
class App(Tk):
	def __init__(self):
		super().__init__()
		self.value = IntVar()
		self.value.set(0)
		self.button = Button(self, command=lambda: self.value.set(self.value.get() + 1))
		self.button.pack()
		self.value_display = Label(self, textvariable=self.value)
		self.value_display.pack()
		
App().mainloop()

Отредактировано ayb (Янв. 17, 2016 20:29:32)

Офлайн

#3 Янв. 17, 2016 21:18:38

Quazar
Зарегистрирован: 2016-01-17
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Возврат значения из функции

Так то да, но меня интересует как при срабатывании какого либо эвента вызывать функцию и потом получить результат работы этой функции. Максимум что накопал в инете это как передавать параметры, а вот как получить результат нигде инфы нет

Офлайн

#4 Янв. 17, 2016 22:47:53

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Возврат значения из функции

Что значит “получить результат”? Поясните на примере GUI.
Например: Есть кнопка. Я на нее нажимаю и выполняется функция, а ее результат ….

Офлайн

#5 Янв. 17, 2016 23:52:29

Quazar
Зарегистрирован: 2016-01-17
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Возврат значения из функции

from tkinter import *
root = Tk()
root.title('Fecha')
root.minsize(216, 300)
#к примену в программе имеется одна переменная которую будут использовать различные функции
yy=10 
def event1(a): #эта фукнция должна делать проверку, икрементировать и вызывать другую функцию
	if a<20:
		a +=1
	show1(a)
	return a
	
def event2(a):#эта фукнция должна делать проверку, декрементировать и вызывать другую функцию
	if a>1:
		a-=1
	show1(a)
	return a
	
def show1(a):
	lb_y.config(text=a)
fr_kal=Frame(root, bg='DeepSkyBlue4', bd=1, relief=RIDGE)  
fr_kal.pack(expand=YES, fill=BOTH) 
lb_y=Label(fr_kal, font='FreeMono 10 bold', bg='DeepSkyBlue4', fg='white')
lb_y.place(x=85, y=1)
but_1=Button(fr_kal,text='+1', cursor='hand2', bg='cyan')
but_1.place(x=82, y=220, width=50, height=24) 
but_2=Button(fr_kal,text='-1', cursor='hand2', bg='cyan')
but_2.place(x=82, y=260, width=50, height=24)
but_1.bind('<Button-1>', lambda event: event1(yy))
but_2.bind('<Button-1>', lambda event: event2(yy))
lb_y.config(text=yy)
root.mainloop() 

Видно что функции возвращают новое значение, но как его опять сохранить в переменную?
Если использовать функцию без ивента, то“ yy=event2(yy)” без проблем изменит значение переменной.
А вот с ивентом -“but_2.bind('<Button-1>', lambda event: yy=event2(yy))” - так не прокатывает. В примере функции небольшие, но если на деле нужно будет в функции делать какие-либо большие махинации с числом.
Поэтому хочу узнать, есть ли возможность получать результат функции которая вызывается ивентом не используя глобальную переменную в самой функции?

Офлайн

#6 Янв. 18, 2016 00:02:02

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Возврат значения из функции

1. Использование глобальных переменных это чистое зло.
2. Event душить не стоит все-же. Он многое чего делает полезного.
3. from tkinter import * делать нельзя никогда.

По Вашему вопросу. Есть var переменные (StringVar, IntVar и т.п.). Создаете и передаете.

Или можно для упрощения использовать mutable тип (например список). В этом случае Вы просто будете передавать ссылку на объект, а объект будет один, но при этом обновление всех мест, где объект отображается ложиться на Ваши плечи

Офлайн

#7 Янв. 18, 2016 00:13:43

Quazar
Зарегистрирован: 2016-01-17
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Возврат значения из функции

4kpt_IV
Использование глобальных переменных это чистое зло.
По этому хотел узнать другой способ

4kpt_IV
3. from tkinter import * делать нельзя никогда.
Это я знаю, читал, только пробные программки проще так писать

Большое спасибо, попробую IntVar.

Офлайн

#8 Янв. 18, 2016 00:28:58

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Возврат значения из функции

Quazar
Это я знаю, читал, только пробные программки проще так писать

Неверный подход. Потом эта программка станет частью другой, а та другая пакетом и … Ну Вы меня поняли.

P.S. Эта конструкция нормальная, но не в случае tkinter. Конкретно для tkinter ее использовать нельзя. Ни в коем случае!

Офлайн

#9 Янв. 18, 2016 00:38:11

Quazar
Зарегистрирован: 2016-01-17
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Возврат значения из функции

Спасибо, учту….

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version