Найти - Пользователи
Полная версия: Возврат значения из функции
Начало » Python для новичков » Возврат значения из функции
1
Quazar
Добрый вечер!
Сейчас изучаю “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 работал как обычная функция с возвратом результата?
ayb
Используйте ООП. Сразу все станет проще и понятнее.

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()
Quazar
Так то да, но меня интересует как при срабатывании какого либо эвента вызывать функцию и потом получить результат работы этой функции. Максимум что накопал в инете это как передавать параметры, а вот как получить результат нигде инфы нет
4kpt_IV
Что значит “получить результат”? Поясните на примере GUI.
Например: Есть кнопка. Я на нее нажимаю и выполняется функция, а ее результат ….
Quazar
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))” - так не прокатывает. В примере функции небольшие, но если на деле нужно будет в функции делать какие-либо большие махинации с числом.
Поэтому хочу узнать, есть ли возможность получать результат функции которая вызывается ивентом не используя глобальную переменную в самой функции?
4kpt_IV
1. Использование глобальных переменных это чистое зло.
2. Event душить не стоит все-же. Он многое чего делает полезного.
3. from tkinter import * делать нельзя никогда.

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

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

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

Большое спасибо, попробую IntVar.
4kpt_IV
Quazar
Это я знаю, читал, только пробные программки проще так писать

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

P.S. Эта конструкция нормальная, но не в случае tkinter. Конкретно для tkinter ее использовать нельзя. Ни в коем случае!
Quazar
Спасибо, учту….
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