Topic: passare il valore di una variabile da una funzione all'altra  (Letto 256 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Blackeyes972

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo




class MyLayout(Widget):

    def start(self, switchObject, switchValue):
        val = switchValue
        if (switchValue):

            self.ids.lbl.text = "Switch ON"
        else:
            self.ids.lbl.text = "Switch OFF"

    def press(self):
        if val == True:
            Window.clearcolor =(39/255,37/255,40/255,0.8/255)

da questo codice che è solo un esempio come passo il valore di val nella funzione press. In generale come passo il valore di una variabile da una funzione all'altra?

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 677
  • Punti reputazione: 0
    • Mostra profilo
Re: passare il valore di una variabile da una funzione all'altra
« Risposta #1 il: Dicembre 10, 2022, 08:13 »
Discorso di una certa complessità, non breve da descrivere esaustivamente, esistono diverse possibilità per conoscere il valore di una variabile all'interno di una funzione, o metodo come nel Tuo caso, la più "immediata" sarebbe passare la variabile da valutare quale parametro della funzione, ciò significherebbe dover trasformare la definizione della Tua funzione "press" come segue
    def press(self, var: bool) -> None:

N.B. - ho utilizzato la notazione con il typing giusto per chiarire il tipo di variabili in gioco, non è una notazione d'obbligo.
La conseguenza di tale differenza sarebbe che dovresti invocare detta funzione con un valore posizionale booleano (True o False) in corrispondenza di "var" ... a parte le possibili implicazioni sulla codifica, il passaggio dei parametri ad una funzione ha un articolato insieme di regole, una lettura del capitolo 4.8 del tutorial potrebbe chiarire le idee in merito.
Per altro, si potrebbe "giocare" con le regole di visibilità delle variabili, altro argomento articolato, non complicato ma inizialmente molto duro da digerire, un buon libro aiuterebbe senz'altro sull'argomento, che in ogni caso è da capire molto bene, ma una ricerca in rete potrà dare molti esempi superficiali, tipo questo scelto a caso.

Comunque, il discorso si complica ulteriormente dato che nel Tuo codice si sta utilizzando una classe, perché potrebbero entrare in gioco i concetti di "variabili di classe" e "variabili di istanza" ed in ogni caso un livello aggiuntivo sulla visibilità su cui i capitoli 9.1 - 9.2 del tutorial potrebbero darti una introduzione.

Dopo queste opportune premesse, ovviamente da approfondirsi, che soprassiedono il design del codice da farsi, e chiarendo che lascia il  tempo che trova, essendo la strutturazione d'insieme del codice ciò che obbliga, provo a dirti ciò che faccio io in linea generale quando mi occorre in una mia classe una stessa condizione di controllo in più metodi della stessa classe :
  • definirei, valorizzandola, una variabile di istanza (p.e. self.var) in fase di instanziamento (nello __init__);
  • utilizzerei tale variabile di istanza nelle fasi decisionali che lo richiedono;
  • nel caso le condizioni dovessero essere stabilite all'estero della classe definirei un setter.
Una schematizzazione di tali accorgimenti potrebbe essere :
class MyLayout(tk.Label):
    def __init__(self, parent, *args, **kwargs):
        ...
        self.window = parent
        self.var = True
        ...
        super().__init__(self.window, *.args, **kwargs)

    def start(self):
        if (self.var):
            self.configure(text = "Switch ON")
        else:
            self.configure(text = "Switch OFF")

    def press(self):
        if self.val == True:
            self.window.clearcolor =(39/255,37/255,40/255,0.8/255)

    @property
    def switch(self):
        ''' Restituisce lo stato di "switch" del widget '''
        return self.var

    @switch.setter
    def switch(self, value):
        ''' Imposta lo stato di "switch" del widget '''
        self.var = value


Tale "impostazione" è fatta perché, dal Tuo codice, ho l'impressione che Tu voglia sub-classare una label per farla agire "diversamente" rispetto ad una determinata condizione, la sostituzione di "Widget" con "tk.Label" perché non tutti i widget hanno la proprietà "text" ed ho interpretato il tuo "Window" quale il "parent" (oggetto contenitore) della label ... non è detto che la mia interpretazione sia calzante alla situazione, ma si può ben poco con l'andar di notte e indovinare ;)

Edit : corretta l'istruzione " if val == True:" in "press"
« Ultima modifica: Dicembre 10, 2022, 15:01 da nuzzopippo »

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.723
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re: passare il valore di una variabile da una funzione all'altra
« Risposta #2 il: Dicembre 10, 2022, 11:55 »
Vedo un bel po' di confusione.


Definisci una classe con dei metodi, ma non specifichi come né dove li invochi. Assumi di passare una variabile da un metodo all'altro, ma di preciso non si capisce come.


Non esistono passaggi magici di variabili da una funzione all'altra, esistono gli scope, lo stack e i parametri.

Offline Blackeyes972

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re: passare il valore di una variabile da una funzione all'altra
« Risposta #3 il: Dicembre 10, 2022, 19:59 »
Discorso di una certa complessità, non breve da descrivere esaustivamente, esistono diverse possibilità
Grazie infinite per la risposta molto articolata e comprensibile e per i link di approfondimento che non mancherò di studiare ho compreso la logica che è alla base proverò ad applicarla!

Offline Blackeyes972

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re: passare il valore di una variabile da una funzione all'altra
« Risposta #4 il: Dicembre 10, 2022, 20:12 »
Vedo un bel po' di confusione.

Come darti torto! :-)
Detto questo il codice era solo per far comprendere cosa volevo sapere

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.723
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re: passare il valore di una variabile da una funzione all'altra
« Risposta #5 il: Dicembre 11, 2022, 00:16 »
Tendenzialmente tu vuoi un widget con stato.


Lo stato in questo caso è "lo switch è on/off".


Questo naturalmente conduce ad una variabile d'istanza.


Se e come esporre la sua mutabilità all'esterno sta a te deciderlo.

Offline Blackeyes972

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re: passare il valore di una variabile da una funzione all'altra
« Risposta #6 il: Dicembre 11, 2022, 12:58 »
allora l'idea di base era questa un piccolo generatore di qrcode scritto da me per imparare:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.core.window import Window
import qrcode
# con il builder posso nominare il file .kv come voglio
Builder.load_file('QrCode.kv')



class MyLayout(Widget):

    def qr_code(self):
        self.input_data = self.ids.text_input.text
        self.fillcolor = self.ids.input_fill.text
        self.bcgcolor = self.ids.input_bcgcolor.text
        if self.input_data == '':
            self.ids.text_input.hint_text = "The input box cannot be empty"
            return
        if self.fillcolor == '':
            self.fillcolor = 'black'
        if self.bcgcolor == '':
            self.bcgcolor = 'white'
         

        #Creating an instance of qrcode
        self.qr = qrcode.QRCode(
                version=1,
                box_size=10,
                border=5)
        self.qr.add_data(self.input_data)
        self.qr.make(fit=True)
        self.img = self.qr.make_image(fill_color=f'{self.fillcolor}', back_color=f'{self.bcgcolor}')
        self.img.save('images/qrcode001.png')
        self.ids.my_image.source = 'images/qrcode001.png'
        self.ids.label.text = 'Image saved in: images/qrcode001.png'
        # Save it somewhere, change the extension as needed:
        # img.save("image.png")
        # img.save("image.bmp")
        # img.save("image.jpeg")

    def reset(self):
        self.ids.text_input.text = ''
        self.ids.my_image.source = ''
        self.ids.label.text = ''
        self.ids.text_input.hint_text = 'Write text here...'






class MyApp(App):
    def build(self):
        self.title = "QR Code"
        Window.set_icon('images/1.png')
        #Window.size = (1024, 1024)
        Window.clearcolor =(39/255,37/255,40/255,0.8/255)

        return MyLayout()



if __name__ == '__main__':
    MyApp().run()

al posto delle label per il colore e lo sfondo del qrcode avrei voluto usare dei checkbox o radio button il cui stato viene gestito da una funzione apposita dove se il check è flaggato la variabile color veniva valorizzata con il colore red
def checkbox_click(self, instance, value):
                              if value == True:
                                    color ='red'

e poi passata a fill_color presente nella funzione qr_code
        self.img = self.qr.make_image(fill_color=f'{self.color}')

ovviamente la variabile color non viene vista dalla funzione checkbox_click in sostanza volevo capire come usare lo stato dei checkbox. prima di chiedere e avere le risposte da voi avevo provato passare lo stato del checkbox ad una variabile resa globale per poi usarla nella funzione qr_code o fare return color dalla funzione checkbox_click per usare color esternamente ma non ha funzionato. Successivamente avrei voluto fare lo stesso per gestire il formato di salvataggio del qrcode

« Ultima modifica: Dicembre 11, 2022, 13:06 da Blackeyes972 »