marcello
Profilo di
Nome | marcello |
---|---|
Indirizzo email | n/a |
Messaggi | 8 |
-
- 2017-09-24 23:17:52
- Re: barra di scorrimento - soluzione: create_windows
- Forum >> Programmazione Python >> GUI
- il Frame non va inserito con pack() nel Canvas, ma tramite create_window().
Errore da principiante!
-
- 2017-09-24 17:23:05
- Re: barra di scorrimento, o meglio Canvas con Frame!
- Forum >> Programmazione Python >> GUI
- In effetti la domanda relativa alla Scrollbar è subordinata ad un'altra.
Se nel 'Canvas' si definisce un 'Frame', il 'Canvas' non si vede più?
Esempio:
import tkinter as tk finestra = tk.Tk() quadro = tk.Frame(finestra, width=800, height=600) barra = tk.Scrollbar(finestra, orient=tk.VERTICAL) griglia = tk.Canvas(quadro, width=800, height=600, scrollregion=(0, 0, 800, 1200)) griglia.config(yscrollcommand=barra.set) barra.config(command=griglia.yview) ovale = griglia.create_oval(600, 10, 800, 1000, fill = 'black') testo = griglia.create_text(20,10, text = 'griglia') griglia.pack() barra.pack(side=tk.RIGHT, fill=tk.Y) quadro.pack() finestra.mainloop()
La Scrollbar funziona correttamente!
Ora aggiungo la definizione di un Frame nel Canvas. Il Canvas scompare e sembra del tutto inutile. La Scrollbar non ha più alcun effetto.
Commetto qualche errore? Non posso controllare con una Scrollbar l'intera finestra?
import tkinter as tk finestra = tk.Tk() quadro = tk.Frame(finestra, width=800, height=600) barra = tk.Scrollbar(finestra, orient=tk.VERTICAL) griglia = tk.Canvas(quadro, width=800, height=600, scrollregion=(0, 0, 800, 1200)) griglia.config(yscrollcommand=barra.set) barra.config(command=griglia.yview) ovale = griglia.create_oval(600, 10, 800, 1000, fill = 'black') testo = griglia.create_text(20,10, text = 'griglia') griglia.pack() barra.pack(side=tk.RIGHT, fill=tk.Y) quadro.pack() riquadro0 = tk.Frame(griglia, width=20, height=60) riquadro0.pack(side=tk.RIGHT) finestra.mainloop()
-
- 2017-09-23 20:42:25
- barra di scorrimento
- Forum >> Programmazione Python >> GUI
- Non è possibile controllare con una barra di scorrimento on oggetto Canvas contenente oggetti Frame?
esempio:
import tkinter as tk finestra = tk.Tk() quadro = tk.Frame(finestra, width=800, height=600) barra = tk.Scrollbar(finestra, orient=tk.VERTICAL) griglia = tk.Canvas(quadro, width=800, height=600, scrollregion=(0, 0, 800, 1200)) riquadro0 = tk.Frame(griglia, width=400, height=600) riquadro1 = tk.Frame(griglia, width=400, height=600) griglia0 = tk.Canvas(riquadro0, width=400, height=1200, scrollregion=(0, 0, 400, 1200)) griglia1 = tk.Canvas(riquadro1, width=400, height=1200, scrollregion=(0, 0, 400, 1200)) griglia.config(yscrollcommand=barra.set) barra.config(command=griglia.yview) ovale = griglia0.create_oval(0, 0, 400, 1000, fill = 'red') testo = griglia0.create_text(10,10, text = 'griglia0') ovale1 = griglia1.create_oval(0, 0, 400, 1000, fill = 'green') testo1 = griglia1.create_text(10,10, text = 'griglia1') riquadro0.pack(side=tk.RIGHT) riquadro1.pack() griglia0.pack(side=tk.RIGHT) griglia1.pack() griglia.pack() barra.pack(side=tk.RIGHT, fill=tk.Y) quadro.pack() finestra.mainloop()
-
- 2017-01-07 00:50:42
- Re: consiglio in stile funzionale
- Forum >> Programmazione Python >> Scripting
- (mi riscuso per l'interruzione, il gelo intorpidisce le dita.)
dicevo: l'occupazione di memoria della lista prevede lo spazio per l'aggiunta di altri elementi, forse solo se si usa append, ma credo sia implicito l'uso di append (questa parte non l'ho ben chiara).
Sicuramente, quando lo spazio riservato per le aggiunte termina, la lista verrà copiata e riallocata in un nuovo spazio di memoria contiguo, altro tempo da aggiungere e inevitabile frammentazione della memoria.
Comunque devo ringraziarti, la soluzione al problema è semplice e bella!
e se non mi sbaglio la lista generata, non essendo assegnata, verrà cancellata ben presto.
Peccato che la mia variante abbia quella virgola, ...fastidiosa.
Mica si può avere tutto! (se non conosci Mica: "L'el fradel del Pota").
-
- 2017-01-07 00:09:45
- Re: consiglio in stile funzionale
- Forum >> Programmazione Python >> Scripting
- Mi scuso per il messaggio rotto in due parti, ma ho ancora problemi con l'editor del forum (come si esce da quote?)
Infatti il codice non fa parte del testo del libro, l'ho scritto io, ... e si vede!
Spero di avere trascritto in modo corretto (NO copia incolla dal testo in prestito) e soprattutto di non aver infranto i diritti d'autore!
In ogni caso si può ben vedere dal test che occorre il 32% di tempo in più per allocare una lista piuttoto che una tupla, differenza che aumenta con liste più piccole, per liste monodimesionali (range(1)) è addirittura il 52%!
Quindi tante piccole tuple, quando possibile, migliorano le prestazioni. Senza parlare dell'occupazione di memoria, come si vede dalla tabella di allocazione.
-
- 2017-01-06 23:56:43
- Re: consiglio in stile funzionale
- Forum >> Programmazione Python >> Scripting
- "Python alla massima potenza" di Micha Gorelik e Ian Ozvald
(pag.66)
' ... 3. Le tuple vengono salvate in una cache del runtime Python; questo significa che non devono comunicare al kernel di riservare della memoria ogni volta che vogliamo usarne una.'
(pag.67)
'... Inoltre, l'immutabilità di una tupla ... la rende una struttura dati molto "leggera" ... per le liste è necessario più spazio in memoria e più attività di calcolo.'
(pag.68 )
' ... Equazione per l'allocazione di liste in Python 2.7
M = (N >> 3) + (N < 9 ? 3 : 6)
N 0 1-4 5-8 9-16 17-25 26-35 36-46 ... 991-1120
M 0 4-8 16 25 35 46 ... 1120>>> import timeit >>> timeit.timeit('x = list(range(10))') / timeit.timeit('x = tuple(range(10))') >>> 1.326 ... >>> timeit.timeit('x = list(range(5))') / timeit.timeit('x = tuple(range(5))') >>> 1.329 ...
-
- 2017-01-05 14:00:27
- Re: consiglio in stile funzionale
- Forum >> Programmazione Python >> Scripting
- Claudio_F said @ 2017-01-05 12:10:01:Personalmente trovo più leggibile la prima, magari abbreviata in:
obsoleto and [print('aggiorna')] and aggiorna()
Bella!
Mi piace e mi offre lo spunto per affrontare un altro nodo, che da tempo dovrei sciogliere: lista o tupla?
Nel codice scritto sopra genero una lista, che si prende spazio in memoria dati per 4 elementi (in previsione di eventuali aggiunte che non verranno mai fatte).
Non è più economica la soluzione:obsoleto and (print('aggiorna'),) and aggiorna()
generando una tupla che prende spazio in memoria programma, veloce e senza neppure scomodare il kernel, per 1 solo elemento invariabile?
Propongo un altro esempio:
Devo passare ad una funzione un argomento composto da una lista che non verrà modificata.funzione([oggetto.nome for oggetto in listaoggetti])
Ma non è migliore, in ogni senso, scrivere:funzione(tuple(oggetto.nome for oggetto in listaoggetti))
?
-
- 2017-01-02 05:28:45
- consiglio in stile funzionale
- Forum >> Programmazione Python >> Scripting
- Ciao,
sto scrivendo da poco codice in stile funzionale ed avrei qualche dubbio
per tradurre
if obsoleto:
print('aggiorna')
aggiorna()
è meglio scrivere:
1. obsoleto and print('aggiorna') is None and aggiorna()
2. obsoleto and not print('aggiorna') and aggiorna()
3. obsoleto and (print('aggiorna') or aggiorna())
La (1) forse è più leggibile, la (2) sembra non voler stampare ma è più concisa e la (3) ancora di più, ma può trarre in inganno.
Qual'è la migliore soluzione? Ce ne sono altre?
Buon anno e grazie.