Topic: istruzione condizionale IF con TYPE  (Letto 425 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline renzo

  • python unicellularis
  • *
  • Post: 6
  • Punti reputazione: 0
    • Mostra profilo
istruzione condizionale IF con TYPE
« il: Settembre 05, 2022, 17:33 »
vorrei  stampare  in un label tkinte  una stringa  partendo da 2 tipi di dati
una lista  o una stringa
avevo pensato questo ma non funziona ....

    def scritta1(self,scale):
         if type(scale)=='str':
              self.label1.configure(text=scale)
              pass
         else:
              a=""
              print (type (scale))
              for i in scale:
                   a=a+(str(i)+"\n")
              self.label1.configure(text=a)

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 670
  • Punti reputazione: 0
    • Mostra profilo
Re:istruzione condizionale IF con TYPE
« Risposta #1 il: Settembre 05, 2022, 20:09 »
Ci sono varie cosette che "non vanno", in primo luogo il risultato di un "type" non sarà mai uguale a 'str'
Python 3.8.10 (default, Jun 22 2022, 20:18:18) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> value = 'Apelle'
>>> type(value)
<class 'str'>
>>> type(value) == 'str'
False
>>> 'str' in repr(type(value))
True
>>> type(type(value))
<class 'type'>
>>>

bisogna verificare se 'str' è contenuta nella rappresentazione di un oggetto restituito da type, si badi bene: oggetto, una richiesta diretta sul risultato di type darebbe un errore perché non sarebbe direttamente processabile come se fosse una stringa.

Per altro, sospetto che lo stralcio di codice proposto appartenga a qualcosa del genere
# -*- coding: utf-8 -*-

import tkinter as tk

def make_text(ptext):
    print('ricevuto', ptext)
    if type(ptext) == 'str':
        tmp = ptext
    elif type(ptext) == 'list':
        tmp = '\n'.join([str(x) for x in plist])
    else:
        tmp = ''
    lbl.configure(text=tmp)
    lbl.update()
    root.update()
   
root = tk.Tk()
lbl = tk.Label(root, text='')
lbl.grid(row=0, column=0, columnspan=3)
stringa = '1 2 3 4 5'
lista = ['Apelle', 'figlio', 'di', 'Apollo', 'fece', 'una', 'palla', '...']
bttext = tk.Button(root, text='Mostra stringa', command=make_text(stringa))
bttext.grid(row=1, column=0)
btlist =  tk.Button(root, text='Mostra lista', command=make_text(lista))
btlist.grid(row=1, column=1)
btquit = tk.Button(root, text='Esci', command=root.destroy)
btquit.grid(row=1, column=2)

root.mainloop()

Se è questo il caso, la finestra verrà creata  ma la pressione sui pulsanti non funzionerà perché i processi definenti il binding dei pulsanti verranno lanciati in fase di inizializzazione e basta, l'output che si avrebbe sarebbe questo
<class 'type'>
>>>
============= RESTART: /home/nuzzopippo/src/posts/renzo/esempio.py =============
ricevuto 1 2 3 4 5
ricevuto ['Apelle', 'figlio', 'di', 'Apollo', 'fece', 'una', 'palla', '...']
>>>

ed ottenuto senza intervento dell'user, la funzione verrebbe eseguita solo in fase di inizializzazione, per avere il risultato sperato bisognerebbe appoggiarsi a routines intermedie, si provi questo codice, funzionerà
# -*- coding: utf-8 -*-

import tkinter as tk

def update_text(ptext):
    if 'str' in repr(type(ptext)):
        tmp = ptext
    elif 'list' in repr(type(ptext)):
        tmp = '\n'.join([str(x) for x in ptext])
    else:
        tmp = ''
    lbl.configure(text=tmp)
    lbl.update()
    root.update()

def make_text():
    update_text(stringa)

def make_list():
    update_text(lista)
   
root = tk.Tk()
lbl = tk.Label(root, text='')
lbl.grid(row=0, column=0, columnspan=3)
stringa = '1 2 3 4 5'
lista = ['Apelle', 'figlio', 'di', 'Apollo', 'fece', 'una', 'palla', '...']
bttext = tk.Button(root, text='Mostra stringa', command=make_text)
bttext.grid(row=1, column=0)
btlist =  tk.Button(root, text='Mostra lista', command=make_list)
btlist.grid(row=1, column=1)
btquit = tk.Button(root, text='Esci', command=root.destroy)
btquit.grid(row=1, column=2)

root.mainloop()


Ovviamente, la sovrastante codifica è del tutto inefficiente nella implementazione di una GUI, se si utilizza tal tipo di codifica suggerirei di studiarsi (bene) le classi e gli eventi in tkinter prima di procedere oltre

Offline renzo

  • python unicellularis
  • *
  • Post: 6
  • Punti reputazione: 0
    • Mostra profilo
Re:istruzione condizionale IF con TYPE
« Risposta #2 il: Settembre 07, 2022, 11:56 »
grazie
ho aggiornato il codice

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.720
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:istruzione condizionale IF con TYPE
« Risposta #3 il: Settembre 08, 2022, 10:56 »
Ma anche no.


Punto 1, python non è javascript.
Punto 2, se proprio ci si vuole male, si usa isinstance, non type a quel modo.
Punto 3, python usa il duck typing, e anche se non lo si vuole usare, ci sono modi migliori di fare quella roba.

Offline renzo

  • python unicellularis
  • *
  • Post: 6
  • Punti reputazione: 0
    • Mostra profilo
Re:istruzione condizionale IF con TYPE
« Risposta #4 il: Settembre 08, 2022, 15:09 »
il mio intento è quello di scrivere su la stessa label   le risposte  derivanti da una ricerca  o un eventuale  messaggio di errore
1 il messaggio di errore è una stringa che passo alla "funzione def scritta1(self,scale)" tramite il parametro "scale"
2 la risposta è una lista che tramite lo stesso parametro paso alla funzione
quindi io ho bisogno di sapere il parametro passato di che tipo è  e poi gestirlo in maniera diversa

questo è il codice modificato .....

 def scritta1(self,scale):
         if 'str' in repr(type(scale)):
              self.label1.configure(text=a)
              pass
         else:
              a=""
              print (type (scale))
              for i in scale:
                   a=a+(str(i)+"\n")
              self.label1.configure(text=a)

se avete altre idee  ben volentieri

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.720
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:istruzione condizionale IF con TYPE
« Risposta #5 il: Settembre 08, 2022, 16:14 »
Converti la lista in stringa separatamente e passi sempre stringhe qua