Topic: I BOTTONI POSIZIONATI CON .PLACE  (Letto 227 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline AlDi

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
I BOTTONI POSIZIONATI CON .PLACE
« il: Novembre 11, 2020, 20:19 »
Ho da poco iniziato lo studio di Python. Stavo tentando di costruire una finestra con caselle di testo e pulsanti che mi serviranno per gestire una rubrica telefonica.
Ho posizionato i bottoni con la funzione "place" in modo da poterli sistemare in modo ordinato ma poi cambiando la dimensione del font mi sono accorto che i pulsanti cambiano di dimensione e si posizionano in modo disordinato.
Vorrei avere invece del pulsanti che non cambiano di dimensione mentre il font  all'interno si deve adattare in base al testo che il pulsante deve contenere.
Dove sbaglio?



import tkinter as tk


principale = tk.Tk()
principale.geometry("600x600")
principale.title("RUBRICA TELEFONICA")

COGNOME = tk.Label(principale, text="COGNOME", font="Times 16")
COGNOME.grid(row=0, column=0, sticky="E")

NOME = tk.Label(principale, text="NOME",font="Times 16")
NOME.grid(row=1, column=0, sticky="E")

NUMERO1 = tk.Label(principale, text="NUMERO",font="Times 16")
NUMERO1.grid(row=2, column=0, sticky="E")

NUMERO2 = tk.Label(principale, text="NUMERO",font="Times 16")
NUMERO2.grid(row=3, column=0, sticky="E")

CTESTO = tk.Entry(principale,width=50)
CTESTO.grid(row=0,column=1)

NTESTO = tk.Entry(principale,width=50)
NTESTO.grid(row=1,column=1)

N1TESTO = tk.Entry(principale,width=50)
N1TESTO.grid(row=2,column=1)

N2TESTO = tk.Entry(principale,width=50)
N2TESTO.grid(row=3,column=1)

PRICERCA = tk.Button(principale,text="RICERCA",font="bold", width=7, height=3, bg="green")
PRICERCA.place(x=10,y=130)

PINSERISCI = tk.Button(principale,text="INSERISCI",font="bold", width=7, height=3, bg="green")
PINSERISCI.place(x=93,y=130)

PCANCELLA = tk.Button(principale,text="CANCELLA",font="bold", width=7, height=3, bg="green")
PCANCELLA.place(x=176,y=130)

PRICAVA = tk.Button(principale,text="RICERCA \nAVANZATA",font="bold", width=7, height=3, bg="green")
PRICAVA.place(x=259,y=130)

PESCI = tk.Button(principale,text="RICERCA \nAVANZATA",font="bold", width=7, height=3, bg="green")
PESCI.place(x=342,y=130)

CASELLA = tk.Text(principale,height=10, width=50)
CASELLA.place(x= 10, y= 220)

CTESTO.focus_set()


if __name__ == "__main__":
    principale.mainloop()

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Re:I BOTTONI POSIZIONATI CON .PLACE
« Risposta #1 il: Novembre 12, 2020, 05:34 »
Ciao @Aidi, comincio col rispondere alla Tua ultima domanda
Ho da poco iniziato lo studio di Python...
Dove sbaglio?
La risposta è contenuta nella Tua prima frase ... probabilmente stai cercando di affrontare troppo presto argomenti più avanzati delle Tue conoscenze attuali.
Le interfacce grafiche sono, di per se, delle strutture software molto complesse, in particolar modo richiedono una conoscenza tutt'altro che approssimativa della programmazione ad oggetti (OOP), uno dei tre paradigmi (imperativa e funzionale gli altri) supportati da python ... dal Tuo codice non appare Tu la conosca...
Se posso, non so come Tu stia affrontando lo studio di python, se, come fanno molti, lo stai affrontando con ciò che trovi in rete lo stai affrontando in maniera "discutibile", difficile approdare a qualcosa partendo da zero, devi farti le ossa sulla base di python e cominciare a capirlo, poi utilizzare "anche" la rete. Bisogna, quindi, affrontare il discorso in maniera sistematica, utenti esperti il cui parere rispetto consigliano di partire con il Lutz, meglio se versione inglese ma esiste anche una versione in italiano, in alternativa, almeno e se non l'hai già fatto, studiati il tutorial di python per farti una idea generale del suo funzionamento.

Dopo 'sta doverosa tirata, passiamo all'argomento "tkinter".
Nel definire i Tuoi controlli Tu stabilisci "manualmente" le dimensioni degli stessi (proprietà width ed height)
PRICERCA = tk.Button(principale,text="RICERCA",font="bold", width=7, height=3, bg="green")

ma NON specifici il font da usare (famiglia, stile e dimensioni), verranno quindi utilizzati quelli previsti di default (dal sistema operativo) per il genere di widget utilizzato : di norma i widget si adattano al loro contenuto ma non quando vengono imposte loro dimensioni precise, nel caso proposto dovresti stabilire TUTTO da codice ... faccenda di discreta complessità, serve utilizzare molte diverse tecniche per diversi oggetti contemporaneamente.

Altro fattore di difficolta è il geometry manager utilizzato : "Place"
È senz'altro il più difficile da usare, richiede il ricalcolo dell'intera finestra ad ogni suo minimo ridimensionamento ... ricalcolo che devi fare Tu, da codice ... scelta molto infelice, la Tua.
Imparando ad usarli, è molto più semplice l'uso degli altri due geometry manager disponibili, grid e  pack, ma bisogna, appunto, comprenderne l'uso.
Una tecnica di base è definire una serie di pannelli contenitore, tramite il widget "Frame", e calibrare in tali pannelli (a loro volta calibrati nella finestra) i controlli logicamente collegati.

Credo sia troppo presto farti esempi del genere ma, giusto per darti una idea elementare ho cercato tra miei vecchi esempi postati per altri interlocutori vari, qui vi è un esempio di finestra per anagrafica utilizzante il gestore di geometria "pack", qui trovi una bozza incompleta di controllo nelle cui finestre di test viene utilizzato tanto pack quanto grid e qui trovi un esempio di applicazione tkinter.
Sono tutti rudimentali e fatti anni fa ma, se li guardi, Ti daranno (pallida) idea delle complessità cui vai incontro affrontando le interfacce grafiche.
Il consiglio rimane quello di sopra : prima affronta python, poi le interfacce grafiche.

Ciao

Offline AlDi

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:I BOTTONI POSIZIONATI CON .PLACE
« Risposta #2 il: Novembre 12, 2020, 20:30 »
grazie per la risposta. Prima di affrontare il tema delle interfacce grafiche ho costruito un codice per gestire una rubrica telefonica in formato "terminale",  poi ho provato a dare una veste grafica a quel programmino, per questo ho iniziato ad avvicinarmi alla GUI. Le funzioni da abbinare ai vari pulsanti le avrei già pronte. Lo scopo era impostare una serie di bottoni allineati tra di loro e con la stessa forma, cosa che non sono riuscito con pack e grid, allora ho provato place. Continuerò a leggere qualche libro in più prima di proseguire.

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Re:I BOTTONI POSIZIONATI CON .PLACE
« Risposta #3 il: Novembre 13, 2020, 10:12 »
grazie per la risposta. Prima di affrontare il tema delle interfacce grafiche ho costruito un codice per gestire una rubrica telefonica in formato "terminale",  poi ho provato a dare una veste grafica a quel programmino, per questo ho iniziato ad avvicinarmi alla GUI. Le funzioni da abbinare ai vari pulsanti le avrei già pronte. Lo scopo era impostare una serie di bottoni allineati tra di loro e con la stessa forma, cosa che non sono riuscito con pack e grid, allora ho provato place. Continuerò a leggere qualche libro in più prima di proseguire.

Mi fa piacere la Tua risposta, fai bene ad approfondire i concetti base prima di affrontare le GUI, approfondisci l'argomento "classi", Ti sarà molto utile.

La parte evidenziata nella citazione mi fa pensare che Tu avessi intenzione di rendere tutti i pulsanti della stessa lunghezza/altezza ... si può fare e la faccenda mi ha fatto rammentare i metodi che a suo tempo escogitai prima di trovare una proprietà che credo non sia documentata, applicabile al gestore grid, costrutto "grid_columnconfigure(...), tale proprietà è "uniform", trovata direttamente nella docs di tcl-tk non ho mai avuto occasione di postare su di essa, ne approfitto per segnalarla, posta a "True" distribuisce uniformemente le colonne.

Per esemplificare, ho rimaneggiato il Tuo codice trasformandolo in classe (e con nomi consoni alla PEP 8). vedi un po' che te ne pare, trovi l'istruzione alla riga 45, nel ciclo di dimensionamento delle colonne

# -*- coding: utf-8 -*-

import tkinter as tk


class MyApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.title('RUBRICA TELEFONICA')
        data_p = tk.Frame(self)
        data_p.grid(row=0, column=0, sticky='nsew')
        label1 = tk.Label(data_p, text='Cognome :', anchor='w')
        label1.grid(row=0, column=0, padx=2, pady=2)
        self.txt_surname = tk.Entry(data_p)
        self.txt_surname.grid(row=0, column=1, sticky='ew', padx=2, pady=2)
        label2 = tk.Label(data_p, text='Nome :', anchor='w')
        label2.grid(row=1, column=0, padx=2, pady=2)
        self.txt_name = tk.Entry(data_p)
        self.txt_name.grid(row=1, column=1, sticky='ew', padx=2, pady=2)
        label3 = tk.Label(data_p, text='Cellulare :', anchor='w')
        label3.grid(row=2, column=0, padx=2, pady=2)
        self.txt_mobile_phone = tk.Entry(data_p)
        self.txt_mobile_phone.grid(row=2, column=1, sticky='ew', padx=2, pady=2)
        label4 = tk.Label(data_p, text='Tel. fisso :', anchor='w')
        label4.grid(row=3, column=0, padx=2, pady=2)
        self.txt_landline_phone = tk.Entry(data_p)
        self.txt_landline_phone.grid(row=3, column=1, sticky='ew', padx=2, pady=2)
        data_p.grid_columnconfigure(1, weight=1)
        command_p = tk.Frame(self)
        command_p.grid(row=1, column=0, sticky='nsew')
        btn_search = tk.Button(command_p, text='Cerca', font='bold', bg='green')
        btn_search.grid(row=0, column=0, sticky='nsew', padx=2, pady=4)
        btn_insert = tk.Button(command_p, text='Inserisci', font='bold', bg='green')
        btn_insert.grid(row=0, column=1, sticky='nsew', padx=2, pady=4)
        btn_del = tk.Button(command_p, text='Cancella', font='bold', bg='green')
        btn_del.grid(row=0, column=2, sticky='nsew', padx=2, pady=4)
        btn_advanced_search = tk.Button(command_p, text='Ricerca avanzata',
                                        font='bold', bg='green')
        btn_advanced_search.grid(row=0, column=3, sticky='nsew', padx=2, pady=4)
        btn_other_search = tk.Button(command_p, text='Altra ricerca',
                                        font='bold', bg='green')
        btn_other_search.grid(row=0, column=4, sticky='ew', padx=2, pady=4)
        command_p.update()
        for i in range(5):
            command_p.grid_columnconfigure(i, weight=1, uniform=True)
        annotation_p = tk.Frame(self)
        annotation_p.grid(row=3, column=0, sticky='nsew')
        self.txt_cell = tk.Text(annotation_p, height=10, width=50)
        self.txt_cell.grid(row=0, column=0, sticky='nsew', padx=4, pady=4)
        annotation_p.grid_columnconfigure(0, weight=1)
        annotation_p.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(3, weight=1)       
       
       
       
if __name__ == '__main__':
    app = MyApp()
    app.mainloop()


[Edit]
In realtà, il parametro "uniform" può essere utilizzato in maniera più sofisticata rispetto a quello "uniform=True" che ho indicato (che comunque funziona ed ho utilizzato per le mie esigenze), sono andato a tradurmi (cosa mai fatta in precedenza) la documentazione dell'algoritmo di costruzione della griglia che ad un certo punto recita :
Citazione
Quando più righe o colonne appartengono a un gruppo uniforme, lo spazio ad esse assegnato è sempre proporzionale al loro peso. (Un peso pari a zero è considerato 1.) In altre parole, una riga o una colonna configurata con -weight 1 -uniform a avrà esattamente la stessa dimensione di qualsiasi altra riga o colonna configurata con -weight 1 -uniform a. Una riga o una colonna configurata con -weight 2 -uniform b sarà esattamente il doppio di quella configurata con -weight 1 -uniform b.
In sostanza, possono configurarsi dimensionamenti diversificati per "gruppi", un veloce test
        for i in range(5):
            group = 'b' if i%2 else 'a'
            command_p.grid_columnconfigure(i, weight=1, uniform=group)

mi ha permesso di fare dimensionamenti "alternati".
« Ultima modifica: Novembre 13, 2020, 12:47 da nuzzopippo »

Offline AlDi

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:I BOTTONI POSIZIONATI CON .PLACE
« Risposta #4 il: Novembre 13, 2020, 20:05 »
Fantastico! mi metterò a studiare il codice che hai scritto! L'argomento delle classi mi è sembrato molto difficile, ci vuole tempo e studio.