Dynamiska värden i PyQt fönster (tracking ISS)
Detta instructable beskriver användningen av dynamiska variabler i ett PyQt fönster.
Qt kan bygga interaktiva, ansluten (Ms/Linux/Android/IoS) fönster. Py Qt kan bygga sådan i Python. Huvudloop för en PyQt scripts består av fönster metoder, använda de fördefinierade window-variablerna. Uppdatera dessa window-variabler är möjligt, men inte en bra idé om omfattande bearbetning behövs. För ISS-tracker fönstret i det första video ta till fångst används threading så att en PyQt fönstret arbeta med "utanför" variabler. Säkert finns det andra (och bättre metoder), men den här fungerar bra och dess struktur "passar min logik".
För båda exempel skapades fönstret layout med Qt Designer. Så, vänligen bortse från mängden kodrader i båda skript. Formatera en fönster lay-out för många fält, kräver deklarativa kod som position på skärmen, storleken, hur det ska reagera på max/minimera fönster, färg, stil, innehåll, anslutna åtgärder, etc. Lyckligtvis genererar Qt Designer alla dessa rader kod baserat på din grafiska layout. Tyvärr till följd av detta, du kommer att sluta med en massa linjer i din huvudsakliga loop.
Eftersom jag ville bekanta sig med PyQt, ive bygga fönstret ISS-tracker med många variabler och annan typ av fält. För dem som är intresserade av, kommer jag utveckla lite mer senare på.
Den andra videoinspelning visar en mycket liten och enkel skript att visualisera det trädande tillvägagångssättet. Python-skript används finns på: Bitbucket
Skriptet simulerar att kasta en tärning och bearbetar resultatet av kast.
Skriptet använder två trådar: en tråd för att upprätthålla visningen av fönstret (PyQt kräver att detta är det viktigaste kretsar av skriptet) och en annan tråd för bearbetning och regelbundet utlösa fönster-tråden. För utbyte av värden, måste båda trådar vara riktad mot samma variabler i minnet. I ännu mer enkla ord: en tråd behandlar vissa uppgifter, placerar resultaten på en speciell plats, ringer på dörrklockan vid huvudloop att berätta det är redo och påpekar där den nya leveransen har placerats.
Så, låt oss se hur det ser ut som i Python:
Skriptet börjar med vanliga import av bibliotek som behövs: "QtCore" för att skapa trådar, "QtGui" för bearbetning fönster bilder, 'datetime' och 'tid' så vi kommer inte att glömma det.
De nästa två "försöka" uttalandena behövs för sammansättningen av fälten på skärmen. Inte ihåg dessa: Qt Designer genererar dessa rader så fort du börjar använda RTF-beskrivningar. (t.ex. för att visa ett annat teckensnitt, färg, storlek, fet/kursiv, etc för alla fält i fönstret måste man definiera en RTF-format (dvs. HTML) deskriptor.)
Då bara några globala variabler: "kasta nummer" och 'totalt av alla kast' väsentliga variabeln är minnet delas mellan båda trådar, som jag döpt till "länka lagring" (gamla vanor...).
Koppla samman lagring här är en sträng där alla variabler måste sättas in av bearbetning-tråden och där de kan läsas från av fönster-tråden.
En annan är av mina gamla vanor en tjänst för att använda strängar. Jag lärde mig hur detta kan spara mycket tid när du felsöker skript. (Och: Qt föredrar strängar för att visas.)
Den gängade (bearbetning) metoden genererar ett slumpmässigt värde (inget emot manipulera; Jag försökte bara att tvinga så mycket volatilitet som möjligt i skärmen), beräknas vissa andra värden och sätter dem i strängen "LinkingStorage".
"Utlösande" klassen ringer"klockan" på de viktigaste loopen. Det kallas av Qthread och skapar och avger en signal var tionde sekund.
Nästa klass består majoriteten av skärmen layout definitioner som ska användas av den viktigaste loopen. Även om inte sådan omfattande metod som i skriptet ISS tracker, är det fortfarande en väsentlig del av skriptet. Metoden "setupUI" innehåller deklarationer för fälten ska visas: objekttyp, position i fönstret, teckensnitt, förhållandet till andra fält, etc. Denna metod är genereras av Qt Designer. Metoden innehåller två kommandon. En tillämpas fältformat ("retranslateUi") och en för att ställa in behandlingstråd ("setupTrigger"). Den senare läggs till i den genererade koden. Metoden "setupTrigger" startar bearbetning tråden och definierar metoden som ska köras när en signal sänds ut av behandlingstråd (dvs "refreshWindow").
Metoden "refreshWindow" delar upp strängen "LinkingStorage", fylld av bearbetning-tråden och omdefinierar fälten fönstret lägga till nytt innehåll. Mindre bearbetning, som att erhålla aktuell tid, kan vara en del av samma metod. Som sagt: större bearbetning, skall avtjänas i behandlingstråd.
Huvudloop talar för sig själv: konstruera ett fönster och Visa det på skärmen.
Enligt min mening är detta det enklaste sättet att lägga till dynamiska data i ett fönster.
Bygga på ISS tracker skärmen
Den kompletta källan för denna ansökan finns på: Bitbucket
Även om mycket större i storlek, hantering av fönstret och dess variabler görs på samma sätt:
- Förklaring av fönstret i klassen "Ui_mainwindow"
- Förklaring av bearbetning-tråden i klassen "utlösande". Timern för avger signal till fönster-tråden är inställt på 3 sekunder. Tillsammans med totalt handläggningstiden 2 sekunder, detta resulterar i en uppdatering av fönstret var 5 sekunder. Även om jag tror det kan vara fäst till en övergripande 2 sekunder, bör man inse att datainsamling för dynamiska fält är gjort av API-anrop. Om du vill använda spåraren för en konstant display, vara medveten om att skriptet på en uppdateringsfrekvens på 2 sekunder kommer att generera 43,200 samtal i 24 timmar. Enligt min mening som är långt bortom "rättvis användning" gratis API
- Data skickas igenom strängen "LinkedStorage"
Datahantering är uppdelad i insamling av statiska data (endast samlas in en gång och visas hela tiden) och insamling av dynamiska data (lokala och ISS).
Användning av flera API's för att få all informationen, som har beskrivits i ett tidigare instructable om Raspberry Pi SenseHat:
Instructable