Forum >> Programmazione Python >> GUI >> programmazione ad oggetti con Tkinter

Pagina: 1

mi servirebbe una mano, non riesco a programmare ad oggetti con tkinter.



mi spiego meglio: attualmente per inserire una label e una textbox utilizzo 4 linee di codice che sono le seguenti




label000A = Label(finestra, text="capacità annua impianto")
label000A.place(x = 20, y = 40)

textBox000 = Text(finestra, height=1, width=10)
textBox000.place(x = 200, y = 40)


e tutto funziona.




il problema è che per comporre un'interfaccia che abbia 50 di quei campi, mi ritrovo a scrivere 50 x 4 = 200 righe di codice quando ne potrei scrivere solo 1 per oggetto passando tutti gli argormenti, tipo:




oggetto1 = campo("capacità annua impianto",1,10,200,40)




il problema è che non riesco a scrivere il codice della classe.. ho provato in mille modi

c'è un anima pia che mi potrebbe aiutare?




grazie



Ciao caro, ovviamente puoi creare una classe o una funzione, ma perché non mettere un bel ciclo con le tue quattro righe?

Pensaci, è una soluzione velocissima.

Cya
grazie per il suggerimento... male che andava stavo anch'io pensando alla funzione, però in effetti il ciclo for mi risparmierebbe ancora maggiormente righe di codice da scrivere



adesso ci provo
grazie per il suggerimento... male che andava stavo anch'io pensando alla funzione, però in effetti il ciclo for mi risparmierebbe ancora maggiormente righe di codice da scrivere

adesso ci provo
Provaci, poi torna qui se non ti viene qualcosa che ci proviamo insieme.

Cya
Uhm, qualche osservazione sparsa.


Primo, una finestra con 50 textbox è la morte della user experience (e probabilmente anche la morte dell'user).


Secondo, in qualche modo *devi* cominciare a usare le classi per organizzare quel codice... non puoi certo continuare a sbattere tutto a livello di modulo. Una buona padronanza dei principi dell'OOP è fondamentale per scrivere gui.


Terzo, non è che ti danno dei punti premio se scrivi codice più corto. Si fattorizza se ha senso farlo, e se si capisce perché lo si sta facendo. Se tutto ciò che ottieni usando un ciclo for è poter dire a te stesso "guarda come sono cool, ho usato un ciclo for per risparmiare cento righe di codice", allora non vale la pena. Il problema delle 50 caselle è un problema di componentistica OOP, non di come fare a risparmiare righe di codice.


Quarto, non usare il posizionamento assoluto, usa i sizer.


Quinto, certamente *puoi* fare un ciclo for che ti produce e ti posiziona 50 caselle e 50 etichette, *ma allora* devi anche usare una struttura-dati parallela (che so, una lista), dove conservare un riferimento alle 50 caselle... perché poi suppongo che dovrai accedervi in un secondo momento per leggerne il valore, no? E se ti limiti a fare una cosa del tipo:

for _ in range(50):
    tb = Text(bla bla)
    tb.place(bla bla)
allora ovviamente a ogni ciclo perdi il riferimento alla casella che hai appena piazzato.




https://leanpub.com/capirewxpython: Capire wxPython, il mio libro
https://pythoninwindows.blogspot.com: Python in Windows, il mio blog e le mie guide
Daniele aka Palmux said @ 2019-02-27 16:17:29:
grazie per il suggerimento... male che andava stavo anch'io pensando alla funzione, però in effetti il ciclo for mi risparmierebbe ancora maggiormente righe di codice da scrivere

adesso ci provo
Provaci, poi torna qui se non ti viene qualcosa che ci proviamo insieme.

Cya

allora ho provato a buttare giù il codice ma mi sono incartato nel senso che non riesco a passare correttamente i dati nel ciclo for




from tkinter import *

finestra = Tk()

w, h = finestra.winfo_screenwidth(), finestra.winfo_screenheight()
finestra.geometry("%dx%d+0+0" % (w, h))
finestra.title("title")

dati1 = ["capacità annua impianto",20,40,200,40,"Ton/anno",300,40]
dati2 = ["capacità oraria impianto",420,40,640,40,"kg/h",740,40]
dati3 = ["calore di reazione",420,70,640,70,"kcal/h",740,40]

for i in range(1,4):
    nameObject = "label"+str(i)
    nameObject = Label(finestra, text= dati1[0 ])
    nameObject.place(x = dati1[1 ], y = dati1[2 ])
    nameObject = Text(finestra, height = 1, width=10)
    nameObject.place(x = dati1[3 ], y = dati1[4 ])
    nameObject = Label(finestra, text=dati1[5 ])
    nameObject.place(x = dati1[6 ], y = dati1[7 ])
finestra.mainloop()





finora ho scritto quanto sopra, ho provato a creare 3 textbox e funziona solo con la prima, non riesco a fargli flottare le liste di dati all'interno del ciclo for




se ci provo con un generico dati=dati+str(i) poi all'interno del ciclo dati1 non lo riconosce come la lista che ho scritto prima del ciclo perchè ad esempio dati1[1 ] non è 20 ma per lui è "a" cioè mi indicizza la stringa
Uhm, qualche osservazione sparsa.


Primo, una finestra con 50 textbox è la morte della user experience (e probabilmente anche la morte dell'user).


Secondo, in qualche modo *devi* cominciare a usare le classi per organizzare quel codice... non puoi certo continuare a sbattere tutto a livello di modulo. Una buona padronanza dei principi dell'OOP è fondamentale per scrivere gui.


Terzo, non è che ti danno dei punti premio se scrivi codice più corto. Si fattorizza se ha senso farlo, e se si capisce perché lo si sta facendo. Se tutto ciò che ottieni usando un ciclo for è poter dire a te stesso "guarda come sono cool, ho usato un ciclo for per risparmiare cento righe di codice", allora non vale la pena. Il problema delle 50 caselle è un problema di componentistica OOP, non di come fare a risparmiare righe di codice.


Quarto, non usare il posizionamento assoluto, usa i sizer.


Quinto, certamente *puoi* fare un ciclo for che ti produce e ti posiziona 50 caselle e 50 etichette, *ma allora* devi anche usare una struttura-dati parallela (che so, una lista), dove conservare un riferimento alle 50 caselle... perché poi suppongo che dovrai accedervi in un secondo momento per leggerne il valore, no? E se ti limiti a fare una cosa del tipo:

for _ in range(50):
    tb = Text(bla bla)
    tb.place(bla bla)
allora ovviamente a ogni ciclo perdi il riferimento alla casella che hai appena piazzato.





la questione è che ho circa 30 caselle di input che mi restituiscono 20 caselle di output. ho già fatto qualcosa di simile ma qui che sono arrivato a implementare 6 caselle, mi sono reso conto che il codice stava diventando veramente lungo (anche perchè contiene formule, grafici, ecc) e volevo renderlo più leggibile con l'oop, ma non facendolo di professione è tutto molto ostico..







Pagina: 1



Esegui il login per scrivere una risposta.