[Python] Kontynuacja programu po wyświetleniu MessageBoxW


(micechal) #1

Witam. Dopiero od niedawna uczę się Pythona a już napotkałem dość trudny jak na moją głowę problem. Wiem, że powinienem przeczytać różne kursy, ale że nie mam za dużo czasu, zwracam się z prośbą do was. Mój problem polega na tym, że z każdym wywołaniem MessageBoxW przez ctypes program zatrzymuje się i czeka aż zostanie naciśnięty jakiś przycisk w MessageBoxW, dopiero potem kontynuuje pracę. Jest jakieś proste rozwiązanie tego problemu, jak np. jakaś flaga w MessageBoxW, czy raczej będę musiał dla MessageBoxW otworzyć nowy wątek, albo stworzyć własne GUI? Przypuśćmy, że chcę wyświetlić dwa MessageBoxW, dla każdego z nich muszę utworzyć nowy wątek, czy jest jakieś proste rozwiązanie mówiące MessageBoxowi że ma nie zatrzymywać programu? Z góry dziękuję za odpowiedź :slight_smile:


(Mirek Sztramski) #2

Wywołujesz funkcję WinAPI, więc dowiedz się jak ona działa:

http://msdn.microsoft.com/en-us/library ... 05(v=vs.85.aspx

Nowe okno jest oknem "modalnym", które blokuje przetwarzanie zdarzeń programu i domaga się interakcji z użytkownikiem.


(Krystian Rosinski) #3

Zaraz, zaraz... Zaczynasz naukę Pythona i na początek wziąłeś ctypes i WinAPI? :shock: Czy to odgórny wymóg? Jeśli chodzi o GUI w Pythonie to proponowałbym raczej tkinter albo PyQt/PySide. Oszczędziłbyś sobie sporo nerwów, a kod byłby lepszy.

W przypadku PyQt/PySide opisywaną właściwość ustawia się przy pomocy metody setModal(modal). Różnica pomiędzy Modal Dialogs, a Modeless Dialog opisana jest na tej samej stronie.

Wykorzystanie wątków w tym przypadku brzmi strasznie (o ile program nie wykonuje w tym czasie np. wymagających operacji I/O).


(micechal) #4

Dzięki za odpowiedź. No dobrze, wywołuję okno modalne czyli program musi się zatrzymać. Mógłbyś mi polecić jakąś inna, nie wymagającą całego gui opcję wyświetlenia takiego okienka? Niezbyt fajnym rozwiązaniem byłoby pisanie całego gui przerastającego program tylko po to, żeby wyświetlić jedno okno.

-- Dodane 10.08.2012 (Pt) 21:49 --

Dzięki iluzion, właśnie o takiego typu odpowiedź mi chodziło. Na początek spróbuję użyć Tkinter bo ze strony Pythona wyczytałem, że to to GUI jest najczęściej używanym, dam znać czy mi się udało :slight_smile: Wziąłem się za ctypes i WinAPI bo wydawało mi się, że natywne Windowsowe rozwiązanie powinno być teoretycznie najprostszym. Jak się okazało, nie jest :slight_smile:


(Krystian Rosinski) #5

WinAPI jest raczej jednym z najtrudniejszych rozwiązań. Trzeba mieć naprawdę ważny powód, żeby po to sięgać.

Pozwolę sobie na krótką charakterystykę Tkinter i Qt:

Tkinter

Zalety:

  • jest w standardowej bibliotece Pythona

  • licencja ("Tcl/Tk is distributed under the BSD license, and Tkinter under the Python license. This means they can be used in proprietary applications.")

  • zwięzły, czytelny kod

Wady:

  • domyślnie GUI nie wygląda natywnie (można skorzystać z modułu ttk — Tk themed widgets, aby to poprawić)

  • brak kreatora GUI z prawdziwego zdarzenia

  • mimo wszystko chyba dość rzadko wykorzystywane (ostatnio gdzieś wyczytałem, że NASA korzysta z Tcl/Tk, ale to nie jest powszechne użycie :wink: )

PyQt/PySide

Zalety:

  • Nowoczesny framework (nie tylko do GUI), rozwijany m.in. przez Nokię (od wczoraj pod skrzydłami firmy Digia)

  • dostępny Qt Designer

  • również wieloplatformowy (dostępny nawet VxWorks -- system również wykorzystywany przez NASA)

  • licencja komercyjna/GPL/LGPL

  • Qt jest używane przez ok. 450 000 deweloperów i tysiące firm na świecie, nie tylko na desktopach

  • powszechnie wykorzystywany w projektach open source -- patrz np. środowisko graficzne KDE

  • natywny wygląd

  • duże możliwości

  • zwięzły, czytelny kod

Wady:

  • licencja komercyjna/GPL/LGPL (niektórzy by woleli BSD etc. :wink: )

Kilka przydatnych linków:

TkDocs

Tkinter tutorial

PyQt tutorial

PySide tutorial

Ps. Przy imporcie pamiętaj, że w Pythonie 3 jest tkinter, a w Pythonie 2 Tkinter. Być może przy okazji porządków w nazwach modułów, klas i funkcji coś jeszcze się zmieniło.


(micechal) #6

Chętnie wybrałbym Qt, ale odstrasza mnie to, że trzeba ściągnąć dodatkowo całe Qt SDK, a to aż 1 GB (tak przynajmniej wyczytałem w oficjalnej dokumentacji). Jest jeszcze problem z kompilowaniem programu do exe. Po skompilowaniu, chciałbym swój program udostępnić, bo nie chcę pisać dla samego siebie. I tutaj moje pytanie: czy ktoś kto będzie chciał używać mojej apikacji też będzie musiał ściągnąć i zainstalować całe Qt, czy używane moduły i biblioteki zostaną dołączone przez kompilator? Jeśli użytkownik nie musi ściągać Qt, chętnie go użyję jeśli ma tyle zalet :slight_smile:


(Krystian Rosinski) #7

Nie musisz pobierać Qt SDK. Najprostszym rozwiązaniem jest zainstalowanie PyQt z oficjalnej strony (dla Pythona 3.2 x64 ok. 30.9 MB -- linki do pobrania na dole strony).

Do "kompilacji" do exe użyj cx_freeze. Działa dokładnie tak jak napisałeś -- dołączy co trzeba. W razie problemów pisz na forum, ale samą "kompilację" proponuję zostawić na koniec, a najpierw nauczyć się podstaw Pythona. Przekładanie doświadczenia z innego programowania w stosunku 1:1 nie wróży nic dobrego.


(micechal) #8

O, to dobrze. http://qt-project.org/wiki/Setting_up_PySide mnie zmyliło. Na naukę mam dużo czasu więc najpierw nauczę się języka, a potem będę kompilował. O kompilację pytałem dlatego, że gdyby nie dało się łatwo kompilować programów w Pythonie używających Qt, rozważałbym zmianę języka, bo do czego byłby mi przydatny język, w którym każdy może sobie podpatrzeć kod, a żeby go uruchomić musi robić to przez konsolę? W związku z tym mam jeszcze jedno pytanie. Czy tak skompilowany program będzie się dało uruchomić na komputerze bez zainstalowanego Pythona? Pobawię się tymi frameworkami i zobaczę czy daję radę, ale to jutro, bo teraz idę spać :slight_smile: Który z nich jest według Ciebie lepszy? PyQt, PySide, czy może to to samo tylko inaczej się nazywa? Są jakieś różnice w szybkości, wyglądzie okien?


(Krystian Rosinski) #9

PySide dla Windows jest tutaj. Nie uważam, że Tkinter jest gorsze od PyQt. Po postu łatwiej mi wypunktować zalety tego drugiego, bo z niego korzystam.

Programy zbudowane przy pomocy cx_freeze są samowystarczalne. Zerknij do wpisów na moim blogu: cz. 1, cz. 2. W szczególności do części 2. Py2exe opisane w pierwszym wpisie nie różni się znacząco od cx_freeze, ale wolno się rozwija (nadal nie ma wersji dla Pythona 3 i być może nie będzie skoro jest cx_freeze). Zmniejszanie rozmiaru binariów za pomocą programu upx jest opcjonalne i można to pominąć. Nie korzystam z tego na co dzień, a instalator programu (PyQt) nad którym teraz pracuję waży niecałe 8MB, więc nie warto sobie zawracać głowy rozmiarem. Dodam jeszcze, że od czasu napisania tych wpisów przerzuciłem się z NSIS na Inno Setup i jestem bardzo zadowolony z tego rozwiązania.

Co do PyQt/PySide sprawa wygląda następująco... Są to bindingi do biblioteki Qt. Qt samo w sobie jest napisane w C++. Z tego względu szybkość programów będzie podobna. Wyglądem też nie będą się różnić. Różnice w API są niewielkie (w przypadku Pythona 3 jeszcze mniejsze). Podstawowa różnica dotyczy licencji. PySide jest na tej samej licencji co Qt, czyli LGPL. PyQt to "nieoficjalny" binding do Qt. Nieoficjalny w tym sensie, że rozwijany przez inną firmę na innej licencji (GPL lub komercyjnej). Nie oznacza to, że jest gorszy, wręcz przeciwnie. Jest znacznie dłużej i intensywniej rozwijany, większość przykładów w sieci opiera się na PyQt. Z tego co zauważyłem obecnie PyQt jest lepiej zoptymalizowane niż PySide (programy wymagają mniej pamięci RAM). Kolejna istotna różnica to taka, że instalator PyQt zawiera domyślnie Qt Designer, a PySide nie. Nic nie stoi na przeszkodzie, żeby doinstalować Qt Creator dla Qt SDK i w nim projektować interfejs.

Podsumowując: Jeśli licencja GPL ci nie przeszkadza -- wybierz PyQt.