Dit instructable beschrijft het gebruik van dynamische variabelen in een PyQt-venster.
Qt kunt bouwen van interactieve, aangesloten (Ms/Linux/Android/IoS) ramen. Py Qt kan dergelijke gebouw in Python. De hoofdlus van een PyQt scripts bestaat uit het venster methoden, met behulp van de vooraf gedefinieerde venster-variabelen. Het bijwerken van deze venster-variabelen is mogelijk, maar niet een goed idee als uitgebreide verwerking nodig is. Bij het venster van de ISS-tracker in de eerste video-opname, wordt draadsnijden gebruikt om een PyQt-venster werkt met "buiten" variabelen. Er zijn zeker andere (en betere methoden), maar deze werkt prima en de structuur 'past bij mijn logica'.
Voor beide voorbeelden is de vensterindeling gemaakt met Qt ontwerper. Dus Negeer de hoeveelheid coderegels in beide scripts. Opmaak van een venster lay-out voor een heleboel velden, vereist declaratieve code zoals de positie op het scherm, de grootte, hoe het moet reageren op max/minimaliseren van het venster, kleur, stijl, inhoud, samenhangende actie, enz. Gelukkig Qt Designer genereert alle deze lijnen van code gebaseerd op uw grafische lay-out. Helaas daardoor zult u omhoog beëindigen met een heleboel lijnen in uw hoofdlus.
Omdat ik leren kennen PyQt wilde, ive ' bouwen het ISS-tracker venster met behulp van een heleboel variabelen en verschillende soorten velden. Voor degenen die geïnteresseerd zijn, zal ik later een beetje meer over uitweiden.
De tweede video-opname toont een zeer kleine en eenvoudige script om te visualiseren de threading aanpak. De python-script dat gebruikt kan worden gevonden op: Bitbucket
Het script simuleert het gooien van een dobbelsteen en verwerkt de uitkomsten van de worpen.
Het script gebruikt twee draden: één thread voor het behoud van de weergave van het venster (PyQt vereist dat dit zal de hoofdlus van het script) en een andere thread voor verwerking en leiden regelmatig tot de venster-draad. Voor het uitwisselen van waarden, moeten beide draden worden gericht aan de dezelfde variabelen in het geheugen. In nog meer eenvoudige woorden: één thread sommige gegevens verwerkt, plaatst de resultaten op een bijzondere locatie, 'de deurbel ringen' op de hoofdlus te vertellen het is klaar en wijst erop waar de nieuwe levering heeft gebracht.
Dus, laten we eens kijken hoe dat eruit ziet in Python:
Het script begint met de gebruikelijke invoer van bibliotheken nodig: 'QtCore' voor het maken van threads, 'QtGui' voor de verwerking van het venster visuals, 'datetime' en 'tijd', zodat we niet over het vergeet.
De verklaringen van de volgende twee 'proberen' zijn nodig voor de samenstelling van de velden op het scherm. Deze niet erg: Qt ontwerper deze regels worden gegenereerd zodra u begint met behulp van de RTF-descriptoren. (bijvoorbeeld voor het weergeven van een ander lettertype, kleur, grootte, vet/cursief, enzovoort van elk veld in het venster moet een RTF-(d.w.z. HTML)-descriptor definiëren.)
Dan nog enkele globale variabelen: 'Gooi-nummer' en 'total van alle worpen' de essentiële variabele is het geheugen dat wordt gedeeld tussen beide threads, die ik noemde het 'koppelen opslag' (oude gewoonten...).
Hier de koppeling opslag is een tekenreeks waarin alle variabelen moeten worden gebracht door de verwerking-thread en waar die van kunnen worden gelezen door de venster-thread.
Nog een van mijn oude gewoonten is een gunst voor het gebruik van tekenreeksen. Ik leerde hoe dit bespaart veel tijd tijdens het debuggen van scripts. (En: Qt voorkeur tekenreeksen voor de weergave.)
De schroefdraad (verwerking) methode genereert een willekeurige waarde (het niet erg het manipuleren; Ik probeerde te dwingen zo veel volatiliteit mogelijk in het scherm), sommige andere waarden worden berekend en zet ze in de tekenreeks 'LinkingStorage'.
De 'trigger' klasse ringen' de Bel' op de hoofdlus. Het heet door Qthread en schept en straalt een signaal elke tiende van een seconde.
De volgende klasse bestaan in meerderheid van de definities van de lay-out scherm door de hoofdlus moet worden gebruikt. Hoewel niet een uitgebreide methode zoals in het ISS tracker script, is het nog steeds een substantieel deel van het script. De 'setupUI' methode bevat de verklaringen voor de velden getoond: objecttype, positie in het venster, het lettertype, de relatie met andere velden, enz. Deze methode wordt gegenereerd door Qt Designer. De methode bevat twee opdrachten. Een de veldindelingen ('retranslateUi') en één om in te stellen van de verwerking draad ('setupTrigger') toe te passen. De laatste is toegevoegd aan de gegenereerde code. De 'setupTrigger' methode begint de wol verwerking en definieert de methode moet worden uitgevoerd wanneer een signaal wordt uitgezonden door de wol verwerking (dat wil zeggen: ' refreshWindow').
De 'refreshWindow' methode splitst de tekenreeks 'LinkingStorage', gevuld door de verwerking-thread en herdefinieert de velden van het venster de nieuwe inhoud toe te voegen. Kleine verwerking, zoals het verkrijgen van de huidige tijd, kan deel uitmaken van dezelfde methode. Zoals gezegd: belangrijke verwerking, moet worden uitgevoerd in de wol verwerking.
De hoofdlus spreekt voor zich: bouwen van een venster en het op het scherm weergeven.
Volgens mij is dit de meest eenvoudige manier om de dynamische gegevens toevoegen aan een venster.
Bouw van het ISS tracker-scherm
De volledige broncode voor deze toepassing kan worden gevonden op: Bitbucket
Hoewel veel groter in grootte, verwerking van het venster en de variabelen gebeurt op dezelfde manier:
- Verklaring van het venster in de klasse 'Ui_mainwindow'
- Verklaring van de verwerking-wol in de klasse 'trigger'. De timer voor het uitzenden van het signaal naar de venster-wol is ingesteld op 3 seconden. Samen met de totale verwerkingstijd van 2 seconden, dit resulteert in een vernieuwing van het venster om de 5 seconden. Hoewel ik denk dat het kan worden vastgemaakt aan een algemeen 2 seconden dat, die men moet realiseren dat de gegevens verzamelen voor de dynamische velden wordt gedaan door API-aanroepen. Als u gebruiken de tracker voor een constante weergave wilt, zich bewust van te zijn dat bij een vernieuwingssnelheid van 2 seconden het script 43,200 oproepen in 24 uur genereert. Naar mijn mening dat veel verder gaat dan de 'fair usage' gratis API's
- Gegevens die worden uitgewisseld via de tekenreeks 'LinkedStorage'
De gegevensverwerking is opgesplitst in de verzameling van de statische gegevens (slechts eenmaal worden verzameld en weergegeven constant) en het verzamelen van dynamische gegevens (lokale en ISS).
Het gebruik van verschillende API's om alle gegevens te verkrijgen, is beschreven in een voormalig instructable over de Raspberry Pi SenseHat:
Instructable