Forum >> Principianti >> CTkEntry e ciclo for

Pagina: 1 2 Avanti

Buongiorno a tutti,

ho utilizzato un ciclo for per realizzare 5 CTkEntry tutti uguali, ilprogramma funziona ma


volevo sapere dalla vostra esperienza:

- se è un operazione che si usa fare?

- Se si, è possibile spostare i dati in una o più variabili?




invio codice

import customtkinter as ctk

ctk.set_appearance_mode('dark')
ctk.set_default_color_theme('blue')

app = ctk.CTk()
app.geometry('500x240')

Gen_font = "Helvetica"
Gen_size = 15
Pos_x=10
Pos_y=20

for n in range(5):
    riga = n * 30
    
    Tl = ctk.CTkLabel(master=app, 
                        width=50,
                        height=25,
                        text="T"+str(n + 1),
                        font=(Gen_font,Gen_size))
    Tl.place(x = Pos_x  , y = Pos_y+ riga)

for n in range(5):
    riga = n * 30

    T1 = ctk.CTkEntry(master=app,
                        placeholder_text="°C",
                        width=50,
                        height=25,
                        corner_radius=10,
                        fg_color=("blue"),
                        justify='center')
    T1.place(x = Pos_x + 50  , y = Pos_y + riga)

app.mainloop()
Saluti

ho utilizzato un ciclo for per realizzare 5 CTkEntry tutti uguali, ilprogramma funziona ma
volevo sapere dalla vostra esperienza:
- se è un operazione che si usa fare?
- Se si, è possibile spostare i dati in una o più variabili?
"Si usa fare?" : dipende dalla finalità, in alcune circostanze può essere comodo farlo ed in altre invece no

"è possibile spostare i dati in una o più variabili?": indubbiamente, anche se si potrebbe tranquillamente farne a meno




Entrambe le operazioni nelle Tue domande hanno risposta nelle necessità a cui deve essere data soluzione, ad esempio: anche se per Entry del tkinter "ordinario" pochi giorni fa in questo post ho utilizzato proprio una tecnica del genere per definire delle entry (da me subclassate) per delle operazioni di gestione della loro attivazione e controllo del loro focus, trovi le istruzioni relative nella __init__ della classe Win, al primo ciclo for, la mia finalità era semplicemente mostrare un esempio di intercettazione del focus nel tragitto "widget => frame" e la risposta degli oggetti fi classe "ActivableEntry" attivati o meno.




... Ovviamente, per le Tue operazioni dovrai strutturare il Tuo codice in modo tale da poter accedere alla memorizzazione delle singole CTkEntry create.


Fatti non foste a viver come bruti...
Scusa ma l'esempio del link non riesco a capirlo.

Pensavo ci fosse un comando semplice tipo:




T11 = variabile1

T12 = variabile2





ma purtoppo ho provato ma non funziona..

Se è troppo complicato torno all'esecuzione di ogni singolo entry..










Scusa ma l'esempio del link non riesco a capirlo.
Pensavo ci fosse un comando semplice tipo: ...
Mi dispiace vivamente dirlo ma quell'esempio che non hai capito va sul "molto semplice", almeno per le necessità inerenti la programmazione di una interfaccia utente ... Ti suggerirei di fare almeno una lettura accorta del capitolo 9 del Tutorial di python (tutto è sempre meglio) per cercare di capire le classi per poi riguardarTi il codice ... tieni persente che in python TUTTO è un oggetto.
Purtroppo, senza conoscenza della OOP e della programmazione ad eventi si fa poca strada nel costruire GUI.

Per altro, pur se carino CustomTkinter è ben lungi dall'essere efficiente, puoi utilizzarlo per "cosette" ms appena vai un pochino sul serio zoppica, ho passato l'intero pomeriggio per cercare di farTi un esempio su come utilizzare la Tua metodologia di codifica solo per constatare che i CTkButton saranno anche carini ma non supportano correttamente il binding (parliamo di eventi) sotto Ti metto il codice di test, provalo, vi è un esempio di interazione con le CTkEntry, tieni presente che come è esposto è funzionante, lancialo da terminale così come è impostato (con uso di pulsanti tkinter.Button) vedrai che funziona, potrai inserire dei valori nella CTkEntry rossa e poi trasferire il valore inserito alla entry corrispondente al pulsante scelto, in questa modalità vedrai che la funzione "on_button" che provvede alla operazione,

Per contro, commenta la riga:

    bt = Button(pn_inp, width=10, text='T'+str(i+1))
e togli i tripli apici al blocco di codice che la sovrasta, costruirai la finestra con bottoni CTkButton ma essi non funzioneranno, da una miriade di test fatti il binding viene richiamato solo in fase di costruzione e non più applicato, salvo casi semplici che non prevedono parametri ... un framework molto azzoppato quello che utilizzi imho.




L'esempio :

import customtkinter as ctk
from tkinter import Button

# funzione di callback
#def on_button(idx=None):
def on_button(evt=None):
    w = evt.widget
    idx = btn.index(w)
    tl_list[idx].delete(0, 'end')  # ripulisco la corrispondente casella
    value = e_inp.get()  # leggo il valore inserito
    tl_list[idx].insert('end', value+'°')


# costruzione finestra
ctk.set_appearance_mode('dark')
ctk.set_default_color_theme('blue')

app = ctk.CTk()
#app.geometry('500x240')

Gen_font = "Helvetica"
Gen_size = 15
pn_data = ctk.CTkFrame(app)
pn_data.grid(row=0, column=0)
for n in range(5):
    Tl = ctk.CTkLabel(master=pn_data, 
                        width=50,
                        height=25,
                        text="T"+str(n + 1),
                        font=(Gen_font,Gen_size))
    Tl.grid(row=n, column=0, padx=5, pady=5)
tl_list = []
for n in range(5):
    T1 = ctk.CTkEntry(master=pn_data,
                        placeholder_text="°C",
                        width=50,
                        height=25,
                        corner_radius=10,
                        fg_color=("blue"),
                        justify='center')
    T1.grid(row=n, column=1, padx=5, pady=5)
    tl_list.append(T1)

# creo un pannello per l'input dei dati
pn_inp = ctk.CTkFrame(app)
pn_inp.grid(row=0, column=1)
lbl = ctk.CTkLabel(master=pn_inp, text='Valore da inserire:')
lbl.grid(row=0, column=0, padx=5, pady=5, sticky='w')
e_inp = ctk.CTkEntry(master=pn_inp,
                     width=50,
                     height=25,
                     corner_radius=10,
                     fg_color=("red"),
                     text_color=('yellow'),
                     justify='center')
e_inp.grid(row=0, column=1, padx=5, pady=5, sticky='w')
lbl = ctk.CTkLabel(master=pn_inp, text='Applica a:')
lbl.grid(row=0, column=3, rowspan=5, padx=5, pady=5, sticky='w')
# creo dei pulsanti di comando per trasferire i dati
btn = []
for i in range(5):
    '''bt = ctk.CTkButton(master=pn_inp,
                       width=100,
                       height=25,
                       corner_radius=10,
                       text='T'+str(i+1),
                       fg_color=('gray', 'green'),
                       text_color=('yellow'),
                       state='normal',
                       #command=on_button(int(i))
                       )'''
    bt = Button(pn_inp, width=10, text='T'+str(i+1))
    btn.append(bt)
    bt.grid(row=i, column=4, padx=5, pady=5)
[x.bind('<Button>', on_button) for x in btn]
bt = ctk.CTkButton(master=app,
                   height=25,
                   corner_radius=10,
                   text='Esci dalla applicazione',
                   text_color=('yellow'),
                   command=app.destroy)  # pulsante chiusura applicazione
bt.grid(row=5, column=0, columnspan=2, padx=5, pady=5, sticky='ew')


app.mainloop()
Ciao
Edit: riedittato il post per togliere degli artefatti inseriti dall'editor dei post.


--- Ultima modifica di nuzzopippo in data 2024-02-08 18:22:36 ---
Fatti non foste a viver come bruti...
Sei un Mito...

Ho utilizzato il tuo suggerimento di codice ed inserendo la riga:

tl_list = []
ed inserendo la variabile nel cliclo for ottengo il risultato di avere i dati di input:

tl_list.append(T1)
questo mi permette poi di utilizzare i valori di input della Entry.




Giro il codice completo:




import customtkinter as ctk

ctk.set_appearance_mode('dark')
ctk.set_default_color_theme('blue')

app = ctk.CTk()
app.geometry('500x240')

Gen_font = "Helvetica"
Gen_size = 15
Pos_x=10
Pos_y=20


def salva():
    global Val_T
    r = tl_list0.get()
    r1 = tl_list1.get()
    r2 = tl_list2.get()
    r3 = tl_list3.get()
    r4 = tl_list4.get()
    

    for n in range(5):
        riga = n * 30
    
        Tl1 = ctk.CTkLabel(master=app, 
                        width=50,
                        height=25,
                        text=tl_listn.get(),
                        font=(Gen_font,Gen_size))
        Tl1.place(x = Pos_x +100  , y = Pos_y+ riga)
    

for n in range(5):
    riga = n * 30
    
    Tl = ctk.CTkLabel(master=app, 
                        width=50,
                        height=25,
                        text="T"+str(n + 1),
                        font=(Gen_font,Gen_size))
    Tl.place(x = Pos_x  , y = Pos_y+ riga)
tl_list = []
for n in range(5):
    riga = n * 30

    T1 = ctk.CTkEntry(master=app,
                        placeholder_text="°C",
                        width=50,
                        height=25,
                        corner_radius=10,
                        fg_color=("blue"),
                        justify='center')
    T1.place(x = Pos_x + 50  , y = Pos_y + riga)
    tl_list.append(T1)


VFin0 = ctk.CTkButton (app, text="salva", command = salva)
VFin0.place(x = 10 , y=200)

app.mainloop()
Sicuramente hai ragione sul fatto che sono alle prime armi , ma mi piace sperimentare.

Sicuramente andrò a studiare il capitolo che mi hai suggerito.




Grazie sicuramente avrò altre domande da porre...



purtroppo vedo che il codice copiato ha delle lacune:




    r = tl_list0.get()
    r1 = tl_list1.get()
    r2 = tl_list2.get()
    r3 = tl_list3.get()
    r4 = tl_list4.get()



il numero (dopo tl_list) 0 è racchiuso tra parentesi quadre [ ]




anche 1 - 2 - 3 - 4


ho visto anche questo:




text=tl_listn.get(),


in realtà :




text=tl_list[ n ].get()







--- Ultima modifica di Gabbo in data 2024-02-08 19:20:20 ---

--- Ultima modifica di Gabbo in data 2024-02-08 19:21:08 ---

--- Ultima modifica di Gabbo in data 2024-02-08 19:25:48 ---
sto provando a reinserire il codice, ma non riesco...








--- Ultima modifica di Gabbo in data 2024-02-08 19:31:23 ---
sto provando a reinserire il codice, ma non riesco...
Ciao, intendi su questo forum? Nel caso usa strumenti come Pastebin, ma ce ne sono ormai millemila, degno di nota uno degli ultimi nati.

Alla fine qui posta solo il link, forse è meglio per tutti vista la nostra non eccelsa qualità nella formattazione... e sono stato buono.

Cya

Forse utilizzo un metodo errato.




Questi sono i miei passaggi:


1 - copio il codice su Visual Studio Code


2 - clicco sull'icona "<>" che si trova prima del quadrato di colore nero (nel forum)


3 - incollo senza formattazione il codice nela riga grigia




il codice si vede corretto, ma quando viene inviato spariscono le parentesi quadre e appaiono dei punti di domanda.




Vi è mai successo?




Saluti

Fabio







il codice si vede corretto, ma quando viene inviato spariscono le parentesi quadre e appaiono dei punti di domanda.

Vi è mai successo?
Ciao caro, aggiungi una \ davanti alle parentesi.

# Senza..
a0

# Con..
a[0]


Cya


Pagina: 1 2 Avanti



Esegui il login per scrivere una risposta.