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

Python 1.Dynamiczne funkcje implementacji GUI w widżetach biblioteki Tix: ScrolledWindow i NoteBook

Do głównej O symbolu

Jedną z zalet dynamicznego języka programowania Python jest możliwość dynamicznego tworzenia graficznego interfejsu użytkownika (GUI) w czasie wykonywania. Wbudowana biblioteka Tkinter umożliwia tworzenie, umieszczanie i przenoszenie różnych elementów graficznych w celu sterowania, wprowadzania i wprowadzania informacji - widgety. Biblioteka Tkinter ma jednak jedną cechę, jeśli liczba widżetów staje się większa niż pozwala na wyświetlanie okna o maksymalnych rozmiarach dostępnych na ekranie monitora, pojawia się problem z dostępem do ukrytego obszaru okna.

Rozszerzenie wbudowanej biblioteki Tkinter, biblioteka Tix (Tk Interface Extension) może rozwiązać ten problem za pomocą widżetu ScrolledWindow - okna z paskiem przewijania. Drugim przydatnym widżetem dołączonym do biblioteki Tix jest okno z kartami - NoteBook.

Jednakże użycie tych widżetów w aplikacjach okiennych w Pythonie ma swoje osobliwości wyświetlania informacji w przypadku, gdy wewnętrzne widgety nie pasują do rozmiaru okna. W tym artykule przyjrzymy się tym cechom podczas organizowania dynamicznego GUI:
Pierwszym przykładem jest umieszczenie widżetu ScrolledWindow w głównym oknie aplikacji, a tym samym wszystkie inne widgety będą automatycznie umieszczane w nim.
Drugim przykładem jest umieszczenie widżetów ScrolledWindow tylko w kartach widgetu NoteBook.

Poniższe przykłady są implementowane w Pythonie 2.7 i systemie operacyjnym Linux: Ubuntu 16.04LTS. Mam nadzieję, że wdrożenie tych przykładów w Twojej wersji Pythona i systemu operacyjnego nie będzie dla ciebie złożone.


Przykład No.1 - widget ScrollledWindow jako główny pojemnik całej aplikacji.

#!/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()

Rezultat scenariusza No.1 można zaobserwować w następujących trzech danych:


Postać 1

Początkowy widok aplikacji No.1 po uruchomieniu. Jest widoczne automatyczne pojawienie się pasków przewijania z prawej strony iw dolnej części okna głównego. Ponieważ całkowity rozmiar zajmowany przez widżet NoteBook jest większy niż oryginalne okno główne (800 x 600) ze względu na liczbę kart określonych w pierwszym cyklu oraz liczbę etykiet określonych w kolejnych dwóch cyklach. Na tej ilustracji pokazano, że z wyszczególnionych 20 kart zostało w oknie głównym umieszczonych tylko 15, a tylko 31 spośród 39 etykiet określonych na pierwszej karcie.


Postać 2

Druga karta w stanie początkowym pokazuje tylko 16 etykiet z 28. Pozycja pasków przewijania pozostaje niezmieniona.


Postać 3

Przesuwanie dolnego paska przewijania w prawo pokazuje, że główne okno obejmuje nie tylko wszystkie zakładki widgetu NoteBook, ale również wszystkie znaczniki umieszczone na drugiej karcie.


Przykład No.2 - widget ScrolledWindow znajduje się wewnątrz każdej karty widgetu 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()

Rezultat scenariusza No.2 można zaobserwować w następujących trzech danych:


Postać 4

Początkowy widok aplikacji No.2 po uruchomieniu. Pasek przewijania pojawił się tylko z prawej strony na karcie Tab1, ponieważ liczba pionowych znaków jest większa niż oryginalne rozmiary okna głównego.


Postać 5

Druga zakładka pokazuje tylko dolny pasek przewijania, ponieważ na tej karcie etykiety są ustawione poziomo.


Postać 6

Przesuwanie paska przewijania w prawo wyświetla wszystkie etykiety na końcu okna, ale nie można uzyskać dostępu do kart z numerami większymi niż 15. Tak więc w wariancie No.2 paski przewijania zapewniają dostęp tylko w zakładce. Jeśli liczba zakładek jest większa niż to, co znajduje się w poziomej wielkości okna głównego, wtedy nie będzie dostępu do nich.

Dlatego jeśli liczba zakładek widgetu NoteBook nie jest zbyt duży, aby przekroczyć limity wyświetlania okna głównego, rozważany wariant miejsca widżetu ScrolledWindow jest do zaakceptowania.

Próba ujednolicenia obu wariantów dała ten sam wynik, co przykład No.1, ponieważ okno widgetu ScrolledWindow rozszerza się do maksymalnych rozmiarów zajmowanych przez obiekty znajdujące się w nim.

Mam nadzieję, że te przykłady pomogą Ci w zaprojektowaniu aplikacji okna w Pythonie.

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

Do głównej O symbolu