Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #58 da revista programar. Faz já o download aqui!

Diogo Guimaraes

Passagem de valores entre métodos

Mensagens Recomendadas

Diogo Guimaraes    0
Diogo Guimaraes

Boas,

Estou a começar a usar Classes em Python, uma aplicação básica com interface gráfico básico (Tkinter) e no entanto surge uma dúvida, como passo valores de uma var de um metodo para a class construtora.

 

from tkinter import *
from tkinter import filedialog, messagebox
import os

class AstutoGUI:

    def __init__(self, master):
        self.master = master
        master.title("App Cpmpila")
        master.iconbitmap('favicon.ico')
       
        self.folderProj = None

        self.label = Label(master, text="Source:")
        self.label.grid(row=0, column=0)

        self.labelPath = Label(master, text=self.folderProj)
        self.labelPath.grid(row=0, column=1)

        self.greet_button = Button(master, text="Browse", command=self.browseFolder)
        self.greet_button.grid(row=0, column=2)

        self.compile_button = Button(master, text="Compilar")
        self.compile_button.grid(row=0, column=3)

        self.label_info = Label(master, text=" ")
        self.label_info.grid(row=2)

        self.label_info = Label(master, text="Python  - Aplicação de teste")
        self.label_info.grid(row=3, column=1)

        #rint (self.folderProj)

    def browseFolder(self):

        self.folderProj = filedialog.askdirectory(initialdir=os.getcwd(), title="Select folder")
        msg = messagebox.showinfo(title="Infooo", message=self.folderProj)
        return self.folderProj


root = Tk()
my_gui = AstutoGUI(root)
root.mainloop()

Passar o conteudo da var self.folderProj do metodo browseFolder, para a labelPath que inicia em branco e após o click e procura da directoria é definida após o OK

 

Abraço

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedropregueiro    4
pedropregueiro

Olá Diogo,

Todas as variáveis que tu declaras com o self passam a ser variáveis da tua classe e são partilhadas numa dada instância dessa mesma classe, por exemplo:

class Test:
  def __init__(self):
    self.var = "initial"
    
  def some_method(self):
    self.var = "changed"
    
t = Test()
print(t.var) # "> initial"
t.some_method()
print(t.var) # "> changed"

 

Portanto, no teu caso, só tens de fazer algo do género:

# imports...

class AstutoGUI:
    def __init__(self, master):
      	# ...
		self.labelPath = Label(master, text=self.folderProj)
		self.labelPath.grid(row=0, column=1)
      	# ...

	def browseFolder(self):
		self.folderProj = filedialog.askdirectory(initialdir=os.getcwd(), title="Select folder")
		self.labelPath['text'] = self.self.folderProj
		# ...

Eu nunca usei o tkinter, mas acho que isto te deve ajudar, pelo menos em teoria :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Diogo Guimaraes    0
Diogo Guimaraes

Boas!

Decidi fazer em class para perceber melhor como isto funciona. No entanto surge um problema, como passo o valor de uma var de uma funcção para a outra sem executar as funções todas internas dessa funcao por exemplo:

from tkinter import *
from functions import *
import compileall


def browsePath():

    folderProj = filedialog.askdirectory(initialdir=os.getcwd(), title="Select folder")
    entryPath.delete(0, END)
    entryPath.insert(0, folderProj)
    messagebox.showinfo(title="Infooo", message=folderProj)

def compileProj():

    compile = folderProj
    compileall.compile_dir(compile, force=True)


root = Tk()
frame = Frame(root)
frame.pack()

bottomFrame = Frame(root)
bottomFrame.pack(side=BOTTOM)

root.title("Astuto - PyCompiler Win")
root.geometry("410x50")

root.iconbitmap("favicon.ico")

labelSource = Label(root, text="Source:")
labelSource.pack(side=LEFT)

entryPath = Entry(root, w=50, text="")
entryPath.pack(side=LEFT)

buttonBrowse = Button(root, text="Browse", command=browsePath)
buttonBrowse.pack()

buttonBrowse = Button(bottomFrame,  text="Compile", command=compileProj)
buttonBrowse.pack(side=BOTTOM)

if __name__ == "__main__":
    mainloop()

Passar o valor de folderProj da função browsePath() para a compileProj() sem que volte a executar a janela de askdirectory..

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedropregueiro    4
pedropregueiro

Acho que tens de ler um pouco mais acerca de como funciona o scope das variáveis em Python: https://docs.python.org/3.6/reference/executionmodel.html#resolution-of-names

As variáveis que declaras dentro de um método, não estão, por defeito, acessíveis em outros métodos. Por exemplo, olha para este pedaço de código:

def method_1():
  some_variable = "test"
  print(some_variable)

def method_2():
  print(some_variable)

method_1()  # > "test"
method_2()  # > NameError("name 'some_variable' is not defined")

Como podes ver, apesar de teres definido uma variável "some_variable" no method_1 , esta variável não passa a estar por defeito acessível em todo o teu código, só mesmo na função que a declarou.

O que podes usar no teu caso são as variáveis globais:

some_var = ""

def method_1():
  global some_var  # para usar a variável fora deste scope
  some_var = "test"

def method_2():
  print(some_var)


if __name__ == "__main__":
  method_1()
  method_2()  # > "test"

No teu caso parece-me que esta talvez seja uma boa opção, mas pra te ser honesto, não costumo usar variáveis globais porque isso normalmente leva a alguns problemas mais tarde.

Aconselho-te a voltar à ideia de ter uma classe e variáveis de classe porque tens muito mais controlo sobre as variáveis e os valores destas e também quando começas a ter mais ficheiros e mais código, usar variáveis globais pode tornar-se num pesadelo.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Dr_Lion    5
Dr_Lion

Pegando no exemplo anterior,e a assumindo que métodos são funcões..

Em vez de usares variáveis globais, podes usar as variáveis comuns (locais) e passar como argumentos:



def method_1(arg1):
  arg1 += "com licor"
  return arg1


def method_2(arg1):
  print(arg1)	#imprime: morangos com licor
  return

if __name__ == "__main__":
  var_local_main = "morangos"
  resultado = method_1(var_local_main)
  method_2(resultado)
  print("O programa terminou.")

 

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade