31 marca 2018

Python – aplikacja okienkowa commander ver.2

Witam w kolejnym wpisie, jednocześnie życzę wesołych świąt. Jak to święta, między sprzątaniem i zakupami warto przysiąść, uspokoić się, założyć słuchawki i odpalić PyCharm. Więc… do dzieła!

Postanowiłem dodać pewną, niezbędną funkcję do naszego ubogiego commandera. Wybór dysku nad listą katalogów oraz plików.

Zacznijmy od jednego, jeśli jeszcze nie czytałeś wpisu dotyczącego pierwszej wersji programu commander, zapraszam tutaj.

Jeśli na dysku masz już działającą pierwszą wersję programu, czas dokonać na niej zmian.

Pierwszą zmianą będzie stworzenie pliku kv. Jeśli nazwałeś swoją klasę główną programu tak jak ja, czyli „Program”, proponuję aby plik kv miał tą samą nazwę (dzięki temu nie musimy ładować go ręcznie przy pomocy „Builder.load_file()”. Cała zawartość pliku u mnie prezentuje się następująco:

<Folder>:
    padding: 10
    spacing: 10

    GridLayout:
        rows: 2

        BoxLayout:
            id: disk
            size_hint: (1, None)

        BoxLayout:
            id: folder_list

Tak, wiem… jestem leń. Ale są święta, czas odpoczynku, więc plik kv ma tylko 13linii kodu. Wewnątrz „GridLayout” znajdują się dwa inne layouty, pierwszy będzie wyświetlał partycje dysków, drugi zaś listę plików i katalogów. Właśnie aby program wiedział do którego layoutu wrzucić odpowiednią zawartość, musimy przydzielić im unikalny id.

Gdybyśmy na tym etapie odpalili nasz program, nie zmieni się w nim praktycznie nic, poza marginesami, a to dla tego, że w metodzie

„show_list” dajemy „self.clear_widgets()”, należy to zmienić i czyścić tylko widgety wewnątrz layoutu o id „folder_list”. Zmieniamy więc „self.clear_widgets()” na „self.ids.folder_list.clear_widgets()”. To samo z dodawaniem nowych widgetów, zmieniamy na „self.ids.folder_list.add_widget(lista)”.

Czas na drugą zmianę, musimy wyświetlić dyski w naszym programie, w tym celu potrzebować będziemy bibliotekę „psutil”, aby ją zainstalować, odsyłam was tutaj.

Prawdopodobnie jednak wystarczy wam polecenie:

pip install psutil

W pliku .py dodajemy na górze:

import psutil

Po zaimportowaniu biblioteki „psutil” wpisujemy poniższych kilka linijek do metody „show_list”

dps = psutil.disk_partitions()
        for dp in dps:
            button = Button(text = dp.device)
            button.bind(on_press=self.changeDisk)

            self.ids.disk.add_widget(button)

Wyjaśnienie:

Do zmiennej „dps” ładujemy wszystkie informacje o dyskach. Dzięki pętli „for” pobieramy dane pojedynczych dysków, tworzymy widget „Button”, nadajemy mu tekst jaką jest nazwa dysku, ustawiamy poniżej akcję przyciśnięcia która wywoła metodę „changeDisk”. Na koniec dodajemy widget wewnątrz layoutu o id „disk”

Metoda „changeDisk”

def changeDisk(self,obj):
       self.folder = obj.text
       self.show_list()

Metoda ta zmieni jedynie zmienną globalną „folder” oraz wywoła metodę „show_list”.

Powyższe zmiany nie są duże, jednak dodają jakże ważna funkcję dla naszego całego programu.

Nie zapomniałem i tym razem, dodaję link do github gdzie można podejrzeć całość kodu, znajduje się tutaj.