sobota, 11 marca 2017

Nawet w krótkim kodzie mogą czyhać błędy.

Ledwie co zacząłem kodować, a już zdążyłem odnaleźć pierwsze problemy.

Jednak, aby sprawę wyjaśnić muszę naświetlić jak wygląda tworzenie okienek i ich elementów w Tkinter. Otóż istnieją trzy sposoby:
- pack - polegający na stosowaniu, w sumie sam nie wiem czego, gdyż ten sposób jest tak bardzo prymintywny, że nigdy go nie stosowałem,
- grid - polegający na układaniu elementów z zastosowaniem siatki oraz z pomocą kierunków (E, W, N, S) oraz przyciągania elementów do tychże kierunków,
- place - polegający na zastosowaniu współrzędnych "x" oraz "y" w pikselach i na podstawie tych współrzędnych umieszczanie elementów w okienku.

O ile przy zastosowaniu metody "grid" nie ma problemu z minimalnymi zmianami wielkości okna, gdyż wszystko się do siebie relatywnie przyciąga, oraz przyciąga do kierunków zakotwiczenia. To przy nieodpowiednim zakotwiczaniu obiektów, ich nieodpowiednie rozjeżdżanie się jest bardzo prawdopodobne. Czyli, najprościej to ujmując, zmiana wielkości okna nie lubi się z tą metodą i generalnie nie wygląda to ładnie. Zastosowanie metody "place" pozwala na ustawianie elementów okienek z dokładnością do jednego piksela, ale o ile koordynaty nie są opisane wzorami (określającymi relatywne położenie względem siebie), to zmiana wielkości okna wiąże się z tym, że wszystkie obiekty pozostają zakotwiczone w swoich stałych miejscach.  Optymalnym rozwiązaniem byłoby wymieszanie rozwiązań z metody "grid" oraz metody "place", ale niestety Tkinter nie pozwala na takie rozwiązania.

Problem polegał na tym, że program pobierał z systemu informację o ustawionej rozdzielczości ekranu i na jej podstawie określał wielkość okna (odejmując kilka pikseli na ramkę oraz pasek start). Sęk w tym, że na systemach posiadających wiele aktywnych monitorów, okno programu było rozciągnięte na wiele monitorów i nie można było jego rozmiaru zmienić, ponieważ taką możliwość zablokowałem poprzez użycie:

root = Tk()
root.resizable(width=0 height=0)


Dlatego też stworzyłem prostą klasę zawierającą statyczną metodę, która sprawdza rozdzielczość ekranu oraz jego proporcję i na tej podstawie dobiera rozdzielczość okienka programu. Mimo tego, że rozwiązanie jest prymitywne to powinno działać. Niestety w domu nie jestem w stanie tego sprawdzić, gdyż nie mam dodatkowego monitora do laptopa. W przypadku gdyby zastosowane rozwiązanie sprawiało problemy mogę użyć biblioteki "ctypes" pozwalającej na dostęp do zasobów i informacji z systemu operacyjnego, wadą tego rozwiązania jest to, że jest ono typowo windowsowe. Mimo, że na razie rozwijam ten program typowo na Windowsa, to w przyszłości chciałbym go również przetestować na linuxie (na wirtualnej maszynie z zainstalowanym linuxem), a zastosowanie typowej dla Windowsa biblioteki pozbawi mnie tej możliwości.

Brak komentarzy:

Prześlij komentarz