Forum >> Programmazione Python >> GUI >> problema a posizionare un controllo slider

Pagina: 1 2 Avanti

Salve ho scritto il seguente codice python:

import tkinter as tk
from tkinter import *

#genera finestra
master = tk.Tk()
#genera titolo finestra
master.title("SINTHETIZER 1.0")
#imposta dimensioni e posiziona finestra
master.geometry("1000x1000+0+0")
#elimina resize
#master.resizable("false")

#stampa valori
def vscale_cb(value):
    print('vertical: {v}'.format(v=value))
def hscale_cb(value):
    print('horizontal: {v}'.format(v=value))

#genera sleider
w = Scale(master, from_=100, to=0, command=vscale_cb, length=400,tickinterval=1)
w.grid(row=100, column=10, padx=10, pady=10)
w.set(10)
w.pack()

mainloop()  #tieni aperta la finestra 



e mi succede che col metodo w.grid() nn riesco a posizionare lo slider nella row 100 e column 10, perchè?


Vi ringrazio per l'aiuto già da ora.








--- Ultima modifica di fabio75 in data 2022-07-16 08:22:21 ---
Io uso il comando:




w.place(x = 65 , y = 325 )




x e y si rifriscono a pixel, quinidi puoi posizionare label o testo in quasiasi posizione della finestra.






Ancora non lo posiziona in modo corretto: ho provato con x=0 ed y=0

ma niente mi esce sempre dove vuole lui.

Perchè?



--- Ultima modifica di fabio75 in data 2022-07-16 08:58:29 ---
Salve ho scritto il seguente codice python:..
e mi succede che col metodo w.grid() nn riesco a posizionare lo slider nella row 100 e column 10, perchè?
Non è che si capisca bene cosa Vorresti fare, tanto meno quale gestore di geometria Tu voglia utilizzare, al widget Scale assegni valori di griglia, quindi non usi "grid" ma il gestore "pack", quindi, il controllo ha posizione "Top-Center" nella finestra ... dovresti vederTi un po' come funzionano questi gestori.

Per altro, quand'anche utilizzassi effettivamente il gestore grid se le 100 righe e 10 colonne precedenti sono vuote non hanno dimensione.




Descrivi bene cosa vuoi fare, se mi trovo cercherò di aiutarti.




Per altro, ogni tanto mi scrivo degli appunti su qualcosa, qualcuno riguarda anche tkinter (ove uso pesantemente le classi) e ti occorre qualche esempio (piuttosto complesso però, diverse centinaia di righe) potrei lincarTi un mio appunto in uso "anche" uno scale posizionato con grid (non lo metto se non richiesto per non fare spam)




Ciao

Fatti non foste a viver come bruti...
Si grazie linkami qualche esempio.

Vorrei posizionare degli slider nella finestra larga 1000x1000.

Vorrei però iniziare a posizionare il primo in verticale in posizione 10,10 pixel e poi il secondo in posizione 20,10 etc con gli altri magari utilizzando un ciclo for per automatizzare la cosa dato che sono molti sti controlli slider che voglio mettere.

Grazie.




Premetto che di classi non sono esperto, ne so poco e sono agli inizi.

P.S.: Che vantaggi ci sono ad usare pesantemente le classi in una applicazione?

--- Ultima modifica di fabio75 in data 2022-07-16 09:19:10 ---

--- Ultima modifica di fabio75 in data 2022-07-16 09:39:48 ---

--- Ultima modifica di fabio75 in data 2022-07-16 09:54:24 ---

--- Ultima modifica di fabio75 in data 2022-07-16 11:23:19 ---
Vorrei però iniziare a posizionare il primo in verticale in posizione 10,10 pixel e poi il secondo in posizione 20,10 etc con gli altri magari utilizzando un ciclo for per automatizzare la cosa dato che sono molti sti controlli slider che voglio mettere.
...

P.S.: Che vantaggi ci sono ad usare pesantemente le classi in una applicazione?
Per la seconda domanda, è un po' complicato rispondere, la programmazione "Object Oriented" (OOP per gli amici) è un paradigma (piuttosto complesso) che permette di costruire degli "oggetti" utilizzando altri oggetti come se fossero mattoncini (diciamo così) ereditando proprietà e metodi degli oggetti utilizzati (ereditarietà) magari trasformandoli a secondo come servano (polimorfismo) od anche inserendovi nuove proprietà e metodi.

Dal punto di vista "pratico" garantisce un maggior controllo (a prezzo di una maggiore complessità) sul proprio codice ... e, purtroppo, sono uno dei pochi modi per affrontare efficacemente la programmazione di interfacce grafiche, procedendo nel Tuo apprendimento Ti accorgerai che è molto più difficoltose (se non impossibile) utilizzare la programmazione procedurale o funzionale con le interfacce grafiche.




Venendo al Tuo problema, NON puoi stabilire la posizione di una serie di controlli senza tener conto che i controlli stessi hanno delle loro proprietà, tra cui le dimensioni, che variano da sistema a sistema secondo le impostazioni generali dello stesso (gestore grafico del s.o., fonts, etc.), ragionare su dimensioni "fisse" (gestore grafico place) ti porta notevoli complessità di gestione, compreso il ricalcolo manuale dell'intera finestra ad ogni minimo ridimensionamento.

Ritengo più opportuno sfruttare le proprietà "elastiche" dei gestori di geometria "grid" o "pack" nel definire la propria finestra, Ti suggerirei di studiare e comprendere tali gestori (oltre alle classi) procedendo a piccoli passi, è fondamentale "capire" cosa si può fare.

Se ho compreso bene la problematica, devi crearTi una specie di mixer, giusto?

Ho buttato giù un semplice esempio (con le classi, proceduralmente sarebbe un incubo) ove effettuo il sub-classamento dell'oggetto Tk di tkinter, gli creo tre pannelli popolandoli con dei cicli for basati su due insiemi di variabili indicanti dei set di strumenti e frequenze, per poi definire degli scale che aggiornano delle Labels (sempre definite in cicli for) con i valori selezionati ... per i 10 pixel, li ho utilizzati per la "separazione" tra i widget (proprietà padx e pady nelle istruzioni grid), spero possa esserTi utile, provalo e cerca di comprendere la logica, ho cercato di essere semplice ma il codice è un bel po', quindi non ho inserito commenti, la docs di tkinter ti potrà aiutare

Il codice:

import tkinter as tk

class MainWin(tk.Tk):
    struments = ['basso', 'chitarra', 'piano', 'sax']
    freqs = ['bassi', 'medio bassi', 'medi', 'medi superiori', 'alti']
    def __init__(self):
        super().__init__()
        self.index = 0
        self.populate()

    def populate(self):
        self.title('Esempio per Fabio75')
        st_pnl = tk.LabelFrame(self, text=' Strumenti ')
        st_pnl.grid(row=0, column=0, sticky='ns')
        self.v_scales = []
        self.h_scales = []
        for i in range(len(self.struments)):
            cnv = tk.Canvas(st_pnl, width=12, height=50)
            cnv.grid(row=0, column=i, padx=10, pady=10)
            cnv.create_text(6, 25, text=self.struments, angle=90, anchor='center')
            #sc = tk.Scale(st_pnl, from_=0, to=100, showvalue=False, orient=tk.VERTICAL, command=self.on_struments)
            sc = tk.Scale(st_pnl, from_=0, to=100, showvalue=False, orient=tk.VERTICAL)
            sc.bind("<ButtonRelease>", self.on_struments)
            sc.grid(row=1, column=i, padx=10, pady=10, sticky='nsew')
            st_pnl.grid_columnconfigure(i, weight=1)
            self.v_scales.append(sc)
        st_pnl.grid_rowconfigure(1, weight=1)
        fr_pnl = tk.LabelFrame(self, text=' Frequenze')
        fr_pnl.grid(row=0, column=1, sticky='ew')
        for i in range(len(self.freqs)):
            lbl = tk.Label(fr_pnl, text=self.freqs)
            lbl.grid(row=i, column=0, padx=10, pady=10)
            sc = tk.Scale(fr_pnl, from_=0, to=100, showvalue=False, orient=tk.HORIZONTAL)
            sc.bind("<ButtonRelease>", self.on_frequences)
            sc.grid(row=i, column=1, padx=10, pady=10, sticky='nsew')
            self.h_scales.append(sc)
        fr_pnl.grid_columnconfigure(1, weight=1)
        val_pnl = tk.LabelFrame(self, text=' Valori selezionati ')
        val_pnl.grid(row=2, column=0, columnspan=2, sticky='ew')
        lbl = tk.Label(val_pnl, text='Strumento', font='bold')
        lbl.grid(row=0, padx=10, pady=10, column=0)
        lbl = tk.Label(val_pnl, text='Volume', font='bold')
        lbl.grid(row=0, padx=10, pady=10, column=1)
        for i in range(len(self.freqs)):
            lbl = tk.Label(val_pnl, text=self.freqs, font='bold')
            lbl.grid(row=0, column=i+2, padx=10, pady=10)
        self.lst_val = []
        row = 1
        for s in self.struments:
            lbl = tk.Label(val_pnl, text=s)
            lbl.grid(row=row, column=0, padx=10, pady=10)
            l_row = []
            lbl = tk.Label(val_pnl, text='', width=4, relief='sunken')
            lbl.grid(row=row, column=1, padx=10, pady=10)
            l_row.append(lbl)
            for i in range(len(self.freqs)):
                lbl = tk.Label(val_pnl, text='', width=4, relief='sunken')
                lbl.grid(row=row, column=i+2, padx=10, pady=10)
                l_row.append(lbl)
            self.lst_val.append(l_row)
            row += 1
        for i in range(len(self.freqs)+2):
            val_pnl.grid_columnconfigure(i, weight=1, uniform='a')

        self.grid_columnconfigure(1, weight=1)

    def on_struments(self, evt):
        w = evt.widget
        try:
            index = self.v_scales.index(w)
            value = w.get()
        except ValueError:
            return
        self.index = index
        self.lst_val[self.index]0.configure(text=value)
        
        
    def on_frequences(self, evt):
        w = evt.widget
        try:
            index = self.h_scales.index(w)
            value = w.get()
        except ValueError:
            return
        self.lst_val[self.index][index+1].configure(text=value)


if __name__ == '__main__':
    app = MainWin()
    app.mainloop()


Azz. vedo che l'editor interferisce con il codice, allego il file, fai sapere se Ti è sufficiente.

Non inserisco link a miei esempi, sono molto più complessi di quanto sopra, comunque, se ritieni di voler dare una guardata fai sapere.



--- Ultima modifica di nuzzopippo in data 2022-07-16 12:25:30 ---
Fatti non foste a viver come bruti...
Allegati
Grazie mille per il codice: vedo che sei molto competente con gli oggetti.

La mia idea è quella di realizzare un synthetizer anni 70 stile Minimoog,

non un mixer.

Lunedì se mi arrivano i componenti inizio la realizzazione del mio progetto elettronico, poi sarà la volta dell'implemntazione del codice C per i due PLC che gestiranno i potenziometri digitali.

Il tutto sarà gestito dal PC con le modifice che andrò a fare al tuo proposta.py.

Cercherò di fare tesoro del tuo codice e capire come funziona.

Scriverò poi le classi che riceveranno i dati dai vari sliders (cosa non facile ed immediata data la mia scarsa dimestichezza con gli OOP).




P.S: Posso eventualmente chiederti consigli in privato su come progettare tali classi nel caso mi piantassi? Te ne sarei grato.


















--- Ultima modifica di fabio75 in data 2022-07-16 13:36:40 ---
Ecco le mie modifiche apportate ed allegate: ho deciso di dare alla GUI del


sinthetizer uno stile tipo Moog anni 70.





Allegati
Grazie mille per il codice: vedo che sei molto competente con gli oggetti.
La mia idea è quella di realizzare un synthetizer anni 70 stile Minimoog,
...
P.S: Posso eventualmente chiederti consigli in privato su come progettare tali classi nel caso mi piantassi? Te ne sarei grato.
Ti assicuro che ho ancora moltissimo da imparare, ho solo avuto la fortuna di interagire con utenti molto esperti che mi hanno dato indicazioni utili e un retroterra java in merito alle classi.

Ma bada bene, la OOP va bene in certi contesti (tipo le GUI), meno bene in altri, Python permette varie modalità di approccio e spesso la programmazione funzionale è utile, approfondisci il linguaggio per imparare a discernere l'approccio utile per i vari contesti da affrontare.




Visto il Tuo mixer.py, hai manipolato l'aspetto grafico, abbi cura di implementare opportune variabili di istanza con cui affrontare gli eventi dei vari gruppi di slider nei relativi binding, così com'è il codice da errori, dato che i binding originali riferiscono ad una variabile che hai eliminato (esegui il codice da terminale per vederli)

Per altro, vedendo immmagini del Minimog-D vedo che i controlli sono pulsanti rotondi, possono anche essere realizzati in tkinter (vedi i Canvas e gli eventi del mouse (key-press, key-release e rilevamento delle coordinate), tieni inoltre presente che altri framework grafici hanno disponibili controlli "rotondi" di tal genere, per vederne meglio tale possibilità, guarda le rappresentazioni di QDial in fondo a questa pagina, le QT non le conosco ma sento che vanno per la maggiore al momento (ovviamente, da non mischiare con tkinter, sono un framework diverso).




Per quanto riguarda i consigli "in privato" : NON voglio fare un rimprovero ma si scrive nei forum per condividere la conoscenza e crescere tutti assieme, almeno, questo è lo spirito con cui sono nati, anche se molti utenti sembrano ignorarlo.

Se scrivo qui è perché cerco di ricambiare con quel poco che so l'enorme aiuto che è stato dato a me, Ti inviterei, pertanto, ad esporre nel Forum i Tuoi problemi in modo che eventuali soluzioni siano disponibili a tutti, per altro potrebbero anche intervenire altri utenti con conoscenze maggiori sulle problematiche poste e, magari, se argomento interessante, persino qualche utente esperto.

Con ciò non voglio negarTi un aiuto se proprio Ti sia necessario ma tieni presente che sono poco in giro, ho miei impegni che assorbono moltissimo tempo e non necessariamente sarei in condizione di impegnarmi su argomenti che esulano dalle mie conoscenze, per altro non perderei certo tempo per faccende che potresti trovare nella docs o con qualche ricerca in rete.




Ciao

Fatti non foste a viver come bruti...
Grazie per il suggerimento.

Ho una mezza idea di presentare il progetto completo (parti elettroniche e software) come cosa open-source, che ne dici?


Non so però se sarà una cosa degna sul piano delle conoscenze tecniche, da poter essere pubblicata come progetto open e farlo evolvere dai vari nerd della rete.

Fammi sapere.





Pagina: 1 2 Avanti



Esegui il login per scrivere una risposta.