Kivy Progress-Bar Updaten

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Dudu
User
Beiträge: 13
Registriert: Donnerstag 13. April 2017, 08:30

Hallo liebes Python Forum,

ich versuche gerade eine Progress Bar für Kivy zum laufen zu bekommen, allerdings schaffe ich es nicht sie richtig zu updaten sodass sie immer auf dem Wert 0 stehen bleibt.

Code: Alles auswählen


Builder.load_string("""
<ScreenThree>:   
    GridLayout:

        rows: 14
        padding: 10
        spacing: 10
        
        BoxLayout:
            spacing: 10
            ProgressBar:
                id: pb
                size_hint_x: .5
                size_hint_y: None
                height: '48dp'
                max: 1.0             
""")

class ScreenThree(Screen):
    igb = 0

    def update (self,dt):
        ProgressBar.value = self.igb   #<- hier liegt das Problem, wie greife ich richtig aus dieser Klasse auf mein Widget zu?
        					    #Mit Progressbar greife ich vermutlich nur auf die Klasse ProgressBar zu und nicht das Widget
    def update_progress(self):
        Clock.schedule_interval(self.update,1/30)

Ich habe es bereits über die ID versucht was auch keinen erfolg brachte. Der Code ist aufs wesentliche beschränkt imports, aufrufe etc sind natürlich vorhanden.

Vielen Dank bereits im Vorraus.

Mit vielen Grüßen,

Euer Dudu
Benutzeravatar
BigZ
User
Beiträge: 30
Registriert: Mittwoch 1. Juli 2015, 21:18
Wohnort: Hamburg
Kontaktdaten:

Was mir auffällt, ohne das jetzt getestet zu haben
Du setzt den Wert von der ProgressBar in deiner update Funktion auf self.igb.
self.igb ist aber immer 0.
Zumindest sehe ich nirgendwo so was wie self.igb += 1

Könntest in deiner update Funktion mal so was wie:

Code: Alles auswählen

def update(self, dt):
    pb.value = self.igb
    self.igb += 1
aus probieren.
"Ist noch λ?"
"Ja, aber das ϕ ist noch ϱ"
Dudu
User
Beiträge: 13
Registriert: Donnerstag 13. April 2017, 08:30

Vielen dank für die schnelle Antwort,

Die Variable igb wird in einer anderen Funktion geändert, diese habe ich aus gründen der Übersichtlichkeit nicht gepostet.
Allerdings finde ich einfach keinen weg aus der Klasse ScreenThree auf die value Variable von Progress Bar zuzugreifen.
Ich denke der Aufruf wie ich ihn gerade mache wird auf die Übergeordnete Klasse ProgressBar zugreifen auf Grund des imports:

from kivy.uix.progressbar import ProgressBar

Gruß Dudu
Dudu
User
Beiträge: 13
Registriert: Donnerstag 13. April 2017, 08:30

Ich habe die Lösung für das Problem gefunden, falls es noch jemand interessiert :

Code: Alles auswählen

    
    
def update (self,dt):
	self.ids.pb.value = self.igb
	
So kann über die ID auch auf die Value zugegriffen werden.

Gruß Dudu
Benutzeravatar
BigZ
User
Beiträge: 30
Registriert: Mittwoch 1. Juli 2015, 21:18
Wohnort: Hamburg
Kontaktdaten:

Edit sagt:
Grmlhmpf! Du warst schneller :D

Über root kannst du auf die Klasse ScreenThree zugreifen von deiner .kv aus.
Sprich über root.update_progress() kannst du auf update_progress() zugreifen.
Allerdings hat das auch noch nicht den gewünschten Effekt bei mir.
Aber ist vielleicht schon mal ein Schubser in die richtige Richtung.
Müsste selber erst noch ein bisschen herum experimentieren und coden um ein funktionierendes Beispiel raus zu bekommen

Code: Alles auswählen

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.uix.progressbar import ProgressBar
from kivy.uix.label import Label

from kivy.clock import Clock

Builder.load_string("""
<ScreenThree>:
    id: test
    GridLayout:

        rows: 14
        padding: 10
        spacing: 10

        BoxLayout:
            spacing: 10
            ProgressBar:
                id: pb
                size_hint_x: .5
                size_hint_y: None
                height: '48dp'
                max: 1.0
                value: root.update_progress()

""")

class ScreenThree(Screen):
    igb = 0

    def update (self,dt):
        self.ids.pb.value += .1
        #self.igb += .1   #<- hier liegt das Problem, wie greife ich richtig aus dieser Klasse auf mein Widget zu?
                           #Mit Progressbar greife ich vermutlich nur auf die Klasse ProgressBar zu und nicht das Widget
    def update_progress(self):
        Clock.schedule_interval(self.update, 1)
        return self.igb

class MainApp(App):
    def build(self):
        return ScreenThree()

MainApp().run()

"Ist noch λ?"
"Ja, aber das ϕ ist noch ϱ"
Dudu
User
Beiträge: 13
Registriert: Donnerstag 13. April 2017, 08:30

Kein Problem, vielen dank für die schnelle Antwort! :)
Antworten