uk ru en pl cs sk bg de fr es ro hu tr ar id ja zh

Python 1. Le funzionalità di implementazione GUI dinamiche sui widget della libreria Tix: ScrolledWindow e NoteBook

Al principio Sul simbolo

Uno dei vantaggi del linguaggio di programmazione dinamico Python è la capacità di creare dinamicamente un'interfaccia grafica (GUI) in fase di runtime. Libreria incorporata Tkinter consente di creare, posizionare e spostare una varietà di elementi grafici per i widget di controllo, input e output. Tuttavia, la libreria Tkinter ha una caratteristica, se il numero di widget diventa più grande di quello che consente di visualizzare la finestra con le dimensioni massime disponibili per lo schermo del monitor, allora esiste un problema di accesso all'area nascosta della finestra.

L'estensione della libreria incorporata Tkinter, la libreria Tix (Tk Interface Extension) può risolvere questo problema con l'aiuto del widget ScrolledWindow - una finestra con barre di scorrimento. Il secondo widget utile che viene fornito con la libreria Tix è la finestra a schede - NoteBook.

Tuttavia, l'uso di questi widget nelle applicazioni finestre in Python ha le proprie peculiarità di visualizzazione delle informazioni nel caso in cui i widget interni non si adattino alla dimensione della finestra assegnata. In questo articolo, verranno esaminati queste funzionalità durante l'organizzazione di una GUI dinamica:
Il primo esempio è quello di posizionare il widget ScrolledWindow nella finestra principale dell'applicazione e quindi tutti gli altri widget saranno automaticamente inseriti in esso.
Il secondo esempio è quello di posizionare i widget di ScrolledWindow solo nelle schede del widget NoteBook.

Gli esempi presentati qui vengono implementati in Python 2.7 e nel sistema operativo Linux: Ubuntu 16.04LTS. Spero che implementare questi esempi nella tua versione di Python e nel sistema operativo non rappresenterà alcuna complessità per te.


Esempio No.1 - Widget ScrolledWindow come contenitore principale dell'intera applicazione.

#!/usr/bin/python

import Tix as tx

root=tx.Tk()
root.geometry("800x600+0+10")

swr=tx.ScrolledWindow(root)
swr.pack(fill=tx.BOTH, expand=1)

nb=tx.NoteBook(swr.window)
nb.pack(fill=tx.BOTH, expand=1)

for i in range(1,21):
	nb.add("tab"+str(i),label="Tab "+str(i))

for k in range(1,39):
	l=tx.Label(nb.tab1,text="label "+str(k))
	l.pack()

for k in range(1,29):
	l=tx.Label(nb.tab2,text="label "+str(k))
	l.pack(side=tx.LEFT)

root.mainloop()

Il risultato dello scenario n. 1 si può vedere nelle tre figure seguenti:


Figura 1

La visualizzazione iniziale dell'applicazione n.1 dopo il lancio. È visibile la presenza automatica delle barre di scorrimento a destra e in un fondo della finestra principale. Poiché la dimensione totale occupata dal widget NoteBook è maggiore della finestra principale di origine (800x600) a causa del numero di schede specificate nel primo ciclo e del numero di etichette specificate nei due cicli successivi. Questa figura mostra che delle 20 schede specificate, solo 15 sono state collocate nella finestra principale e solo 31 delle 39 etichette specificate nella prima scheda sono posizionate.


Figura 2

La seconda scheda nello stato iniziale mostra solo 16 etichette su 28. La posizione delle barre di scorrimento rimane invariata.


Figura 3

Spostamento della barra di scorrimento inferiore a destra si può vedere che la finestra principale copre non solo tutte le schede del widget NoteBook ma anche tutti i tag inseriti nella seconda scheda.


Esempio n.2 - Il widget ScrolledWindow si trova all'interno di ogni scheda del widget NoteBook.

#!/usr/bin/python

import Tix as tx

root=tx.Tk()
root.geometry("800x600+0+10")

swm = []

nb=tx.NoteBook(root)
nb.pack(fill=tx.BOTH, expand=1)

for i in range(1,21):
	nb.add("tab"+str(i),label="Tab "+str(i))
	sw=tx.ScrolledWindow(eval("nb.tab"+str(i)))
	swm.append(sw)
	sw.pack(fill=tx.BOTH, expand=1)

for k in range(1,39):
	l=tx.Label(swm[0].window,text="label "+str(k))
	l.pack()

for k in range(1,29):
	l=tx.Label(swm[1].window,text="label "+str(k))
	l.pack(side=tx.LEFT)

root.mainloop()

Il risultato dello scenario n. 2 si può vedere nelle tre figure seguenti:


Figura 4

La visione iniziale dell'applicazione n.2 dopo il lancio. La barra di scorrimento è apparsa solo sulla destra nella scheda Tab1 poiché il numero di segni verticali è maggiore delle dimensioni originali della finestra principale.


Figura 5

La seconda scheda mostra solo la barra di scorrimento inferiore, poiché in questa scheda le etichette sono posizionate orizzontalmente.


Figura 6

Spostamento della barra di scorrimento a destra, è possibile visualizzare tutte le etichette alla fine della finestra, ma non è possibile accedere a schede con numeri superiori a 15. Così, nella variante n.2, le barre di scorrimento consentono l'accesso solo all'interno della scheda. Se il numero di schede è maggiore di quello che si trova nella dimensione orizzontale della finestra principale, non sarà possibile accedervi.

Pertanto, se il numero di schede del widget NoteBook non è troppo grande per superare i limiti di visualizzazione della finestra principale, allora la variante considerata della posizione del widget ScrolledWindow è abbastanza accettabile.

Tentare di unificare entrambe le varianti ha dato lo stesso risultato dell'esempio n. 1, poiché la finestra del widget di ScrolledWindow si espande alle dimensioni massime occupate dagli oggetti posti in esso.

Spero che questi esempi ti aiuteranno a progettare le tue applicazioni di finestra in Python.

Oleksii Tolkachov (ORCID ID: 0000-0002-4835-0507), Kiev, 30.08.2017.

Al principio Sul simbolo