Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

GUI się wiesza po odpaleniu funkcji



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Python
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Caporeira



Dołączył: 26 Lis 2015
Posty: 49

PostWysłany: Pon Mar 21, 2016 3:39 pm  OP    Temat postu: GUI się wiesza po odpaleniu funkcji Odpowiedz z cytatem Pisownia

Czy może mi ktoś powiedzieć co robię źle że po wciśnięciu przycisku run GUI się wiesza i nie wyświetla splash screenów?

Kod:
import sys
from PyQt4 import QtGui, QtCore
import random
import time
from PySide.QtCore import *
from PySide.QtGui import *

words = ['test1', 'test2', 'test3', 'test4']

n = random.choice(words)

class Window(QtGui.QMainWindow):

def __init__(self):
    super(Window, self).__init__()
    self.setGeometry(500, 150, 500, 600)
    self.setWindowTitle('Test GUI')
    self.home()

def home(self):

    btn_run = QtGui.QPushButton("Run", self)
    btn_run.clicked.connect(self.run)
    btn_run.resize(120, 40)
    btn_run.move(190, 540)
    self.show()

def view_splash(self, arg1):
    label = QLabel("<font color=red size=10<b>" + n[arg1] + "</b></font>")
    label.setWindowFlags(Qt.SplashScreen | Qt.WindowStaysOnTopHint)
    label.show()
    QtCore.QTimer.singleShot(10000, label.close)

def run(self):
    for i in range(len(words)):
        self.view_splash(0)
        time.sleep(3)
        self.view_splash(1)
        time.sleep(3)

app = QtGui.QApplication(sys.argv)
GUI = Window()
sys.exit(app.exec_())

Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
hurgadion



Dołączył: 06 Kwi 2011
Posty: 853
Skąd: Web :)

PostWysłany: Pon Mar 21, 2016 8:05 pm      Temat postu: Odpowiedz z cytatem Pisownia

Nie wiem czy jestem w stanie Ci, pomóc... kod wygląda dla mnie tajemniczo... :)

Natomiast to co zauważyłem, to jest w linijce:
Kod:

label = QLabel("<font color=red size=10<b>" + n[arg1] + "</b></font>")


Co oznacza w tej linijce wyrażenie:
Kod:

n[arg1]


Po pierwsze skąd się bierze n ? arg1 jest chyba Int, tak ? Co oznacza więc [arg1] ?

_________________
miasto nauki praktycznej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
Caporeira



Dołączył: 26 Lis 2015
Posty: 49

PostWysłany: Pon Mar 21, 2016 9:03 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

"n" bierzę się z tego:
Kod:
words = ['test1', 'test2', 'test3', 'test4']
n = random.choice(words)


Czyli wylosowany wyraz z tablicy 'words'

Natomiast 'arg1' najpierw przyjmuje wartość 0 i w następnej kolejności 1.
Które zostają przypisane w tej funkcji:
Kod:
def run(self):
    for i in range(len(words)):
        self.view_splash(0)
        time.sleep(3)
        self.view_splash(1)
        time.sleep(3)
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Hashedone



Dołączył: 23 Sie 2008
Posty: 1179

PostWysłany: Pon Mar 21, 2016 9:07 pm      Temat postu: Odpowiedz z cytatem Pisownia

Wydaje mi się, że jeśli się odpowiada na pytanie w dziale Python, to wypada znać podstawy tego języka - ale spieszę z wyjaśnieniem. Otóż 'n' się bierze stąd:
Kod:
n = random.choice(words)

A arg1 nie jest int - jest tym co przyszło w argumencie funkcji, w Pythonie typowanie jest dynamiczne. Akurat w tym konkretnym przykładzie zawsze będzie intem, ale to przypadek. W szczególności w Pythonie można indeksować czymkolwiek, nie tylko intami. Natomiast w tym konkretnym przypadku funkcja view_spash jest wywoływana z argumentem zawsze 0 i 1 - w tym pierwszym wypadku n[arg1] zawsze przyjmie wartość 't', w tym drugim zawsze wartość 'e'.

Co do pytania - niestety nie znam zbyt dobrze bindu Qt do Pythona, ale na ile znam Qt i Pythona osobno i na ile szybko przejrzałem dokumentację do tej biblioteki, to cała aplikacja działa generalnie na jednym wątku. W szczególności dopóki metoda 'run()' zawołana przez Qt nie skończy swojego działania, qt nie może zrobić nic - obsłużyć sygnałów, renderować, generalnie ze wszystkim czeka na zakończenie się metody run. Ale metoda run trwa 24 sekundy... (każdy obrót pętli trwa 6 sek, 4 obroty pętli - dodatkowe rzeczy poza sleepami pomijam bo ich czas trwania jest pomijalny). Także zgaduję, że jakbyś poczekał 30 sekund, mogło by się wszystko nagle pojawić.

Z drugiej jednak strony jeśli po 24 sekundach nic się nie pojawia, to też mam typ - w końcu metoda view_splash się do końca wykonuje, więc wykonuje się też `QtCore.QTimer.singleShot(10000, label.close)`. Także jeśli mam rację, że wszystko ze splashami jest dobre, tylko qt nie ma ich czasu wyrenderować, to spodziewam się, że zanim skończy się wykonanie metody run, twoje splashe po prostu zdążają zniknąć.

Generalnie cały mój post to mniej lub bardziej ślepe strzały (jak mówię nie znam binda Qt do pythona, pobieżnie przejrzałem dokumentację), ale jeśli mam rację, to rozwiązaniem będzie zapoznanie się z takimi terminami jak wątki i pętla czasu rzeczywistego (generalnie to drugie jest lepszym rozwiązaniem, ale nie wiem na ile ta biblioteka w wersji dla Pythona pozwala na jego proste zaimplementowanie).

_________________
"Jeśli profesor będzie wymagał, żeby podczas pisania kodu chodzić po ścianach, to student ma obowiązek chodzić po ścianach, bo inaczej nie zaliczy. Podane informacje dotyczą normalnych sytuacji. Profesorowi pisz jak profesor chce." ~ marcin_an, 2008
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
hurgadion



Dołączył: 06 Kwi 2011
Posty: 853
Skąd: Web :)

PostWysłany: Pon Mar 21, 2016 9:17 pm      Temat postu: Odpowiedz z cytatem Pisownia

H: sorki, jestem zmęczony ciut i nie zauważyłem tego n, no i tego że n jest Stringiem, nie wiem jak ja patrzyłem na ten kod... :( myślałem, że n jest liczbą... :( pzdr.
_________________
miasto nauki praktycznej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
Caporeira



Dołączył: 26 Lis 2015
Posty: 49

PostWysłany: Wto Mar 22, 2016 7:19 am  OP    Temat postu: Odpowiedz z cytatem Pisownia

@Hashedone

Masz rację, wykonuje się wariant nr 1.czyli na końcu wyswietla się wszystko.
Da się to jakoś przerobić aby najpierw wyświetlić jeden splashscreen i z niewielkim opóźnieniem drugi?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Luke



Dołączył: 17 Cze 2007
Posty: 1893
Skąd: Szczecin

PostWysłany: Wto Mar 22, 2016 9:57 am      Temat postu: Odpowiedz z cytatem Pisownia

Hashedone napisał:
W szczególności w Pythonie można indeksować czymkolwiek, nie tylko intami.

Nie prawda. Nie można indeksować np. listami. :)
https://wiki.python.org/moin/DictionaryKeys

@Caporeira: dlaczego importujesz jednocześnie z PyQt4 i PySide? To dwa różne twory.
https://wiki.qt.io/Differences_Between_PySide_and_PyQt

Nie miałem okazji wykorzystywać bindingów do Qt w Pythonie, ale przeczucie mówi mi, że odpowiedź na to pytanie powinna pomóc: http://stackoverflow.com/questions/20657753/python-pyside-and-progress-bar-threading

_________________
Moje projekty | Endless Horse Run game
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
Caporeira



Dołączył: 26 Lis 2015
Posty: 49

PostWysłany: Sro Mar 23, 2016 12:42 am  OP    Temat postu: Odpowiedz z cytatem Pisownia

@Luke

Wyczytałem że PyQt jest lepsze niż PySide i dlatego chciałem wszystko przepisać na PyQt.
Ale że wyświetlenie splashscreena udało mi się tylko na PySide to na razie (tymczasowo) importuje oba.

A co do moje pytania, przyglądałem się temu przykładowi i na obecną chwilę nie wiem jeszcze jak to zastosować do mojego przykładu.
Za to znalazłem pośrednie rozwiązanie, ale niestety nie rozwiązuje całkowicie mojego problemu. Teraz wyświetla się tak jak chce (czyli z odstępem czasu), ale na okres time.sleep(5) wiesza GUI - w momencie wyświetlenie 2.

Coś takiego napisałem:
Kod:
def run(self):
        print(1)
        self.view_splash(0)
        QApplication.processEvents()
        print(2)
        time.sleep(5)
        print(3)
        self.view_splash(1)
        print(4)
[/code]
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Python Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.13252 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |