Als hobbyproject (ik ben geen programmeur en ben onlangs met Python begonnen) ben ik bezig met een frontend voor een Bluesound muziekspeler. Ik loop tegen het probleem aan dat de code traag is. Als je bij een invoerveld iets invult, dan verschijnt het met een vertraging. En als ik het venster in Windows versleep, dan gaat dat met schokken. Dat gebeurt al als ik de GUI 1 keer per seconde laat updaten. Als ik de GUI 5 keer per seconde laat updaten, dan start het programma niet eens op. Als ik de GUI 1 keer per 10 seconden laat updaten, dan is de vertraging opgelost. Maar ja, dan loopt de GUI (waaronder ook een progressbar) achter.
De code laat 8 GUI-onderdelen (de progressbar, het nu spelende nummer, de playlist etc) 1 keer per seconde updaten met de 'after' functie. Zie hieronder als voorbeeld de code waarmee achterhaald wordt of de muziekspeler op repeat staat of niet. De GUI (de bovenste code) voert 1 keer per seconde de method Status().check_repeat() uit. Die method staat onderaan weergegeven.
Omdat 8 GUI-onderdelen geüpdated moeten worden, wordt de netwerkspeler 8 keer per seconde om zijn status gevraagd door de code urllib.request.urlopen("http://" + ip + ":11000/Status", waarna de muziekspeler zijn status in XML-formaat terugstuurt. Ik vermoed dat de traagheid veroorzaakt wordt doordat de muziekspeler 8 keer per seconde om zijn status wordt gevraagd.
Vraag: ik wil de onderste code zodanig wijzigen dat de netwerkspeler slechts 1 keer per seconde om de status wordt gevraagd, ondanks dat 8 onderdelen van de GUI daar 1 keer per seconde om vragen. Dus ik wil elke seconde 8 keer hetzelfde 'antwoord' doorgeven. Maar ik weet niet hoe ik dat voor elkaar krijg.
Een stukje code van de GUI (Tkinter-bibliotheek). Zie vooral de laatste regel.
Een stukje van de hiermee aangeroepen class:
De GUI:
De code laat 8 GUI-onderdelen (de progressbar, het nu spelende nummer, de playlist etc) 1 keer per seconde updaten met de 'after' functie. Zie hieronder als voorbeeld de code waarmee achterhaald wordt of de muziekspeler op repeat staat of niet. De GUI (de bovenste code) voert 1 keer per seconde de method Status().check_repeat() uit. Die method staat onderaan weergegeven.
Omdat 8 GUI-onderdelen geüpdated moeten worden, wordt de netwerkspeler 8 keer per seconde om zijn status gevraagd door de code urllib.request.urlopen("http://" + ip + ":11000/Status", waarna de muziekspeler zijn status in XML-formaat terugstuurt. Ik vermoed dat de traagheid veroorzaakt wordt doordat de muziekspeler 8 keer per seconde om zijn status wordt gevraagd.
Vraag: ik wil de onderste code zodanig wijzigen dat de netwerkspeler slechts 1 keer per seconde om de status wordt gevraagd, ondanks dat 8 onderdelen van de GUI daar 1 keer per seconde om vragen. Dus ik wil elke seconde 8 keer hetzelfde 'antwoord' doorgeven. Maar ik weet niet hoe ik dat voor elkaar krijg.
Een stukje code van de GUI (Tkinter-bibliotheek). Zie vooral de laatste regel.
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| class Frame_repeat_status(Frame3) def __init__(self, parent): tk.Frame.__init__(self, parent, bg="black") self.parent = Frame3L2 self.widgets() def widgets(self): self.q = tk.Button(self) self.q.status = tk.Button(self, command=Control().repeattoggle, bg="black", fg="#FFF8DC") self.q.status.configure(text="Repeat: " + Status().check_repeat()) self.q.status.place(x=0, y=0, rely=0, relwidth=1, relheight=1, height=0) self.update() def update(self): self.q.status.configure(text="Repeat: " + Status().check_repeat()) self.after(1000, self.update) |
Een stukje van de hiermee aangeroepen class:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| class Status(): def __init__(self): self.status_xml = urllib.request.urlopen("http://" + ip + ":11000/Status") self.status_parsed = minidom.parse(self.status_xml) def check_repeat(self): try: status_elements = self.status_parsed.getElementsByTagName("repeat")[0] repeat = status_elements.firstChild.data if repeat == "0": return "ON" if repeat == "1": return "1" if repeat == "2": return "OFF" except IndexError as error: return "" |
De GUI:

[ Voor 6% gewijzigd door pmeter op 21-08-2019 15:37 ]