Jump to content
Diogo Guimaraes

Passagem de valores entre métodos

Recommended Posts

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

Share this post


Link to post
Share on other sites
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 :)

Share this post


Link to post
Share on other sites
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..

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.")

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.