Невозможно обновить индикатор прогресса - PullRequest
0 голосов
/ 03 апреля 2020

Я создавал приложение и изо всех сил пытался заставить индикатор выполнения обновляться после вызова каждой функции. В приведенном ниже коде я намеревался вызвать функцию, а затем, как только эта функция будет завершена, я обновлю атрибут self.load новым значением. После присвоения self.load нового значения я хочу передать его на индикатор выполнения в kivy, чтобы его значение увеличилось и оно отображалось на экране.

import SEOProgram
import time
import os
import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.clock import Clock
from kivy.uix.widget import Widget
from kivy.uix.progressbar import ProgressBar
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty

class progBar(GridLayout):
    pass

class ThirdWindow(Screen):
    pass

class SecondWindow(Screen):

    pb = ProgressBar()

    def __init__(self, **kwargs):
        super(SecondWindow, self).__init__(**kwargs)
        self.load = 0
        #self.update_bar = Clock.create_trigger(self.update_value)
        pass

    def calculate(self):
        #ids = SecondWindow()
        #print(ids.ids)

        with open("keyword.txt", "r") as keywordread:
            keyphrase = keywordread.readlines()

        phrase = keyphrase
        self.ids.pb.value = self.ids.pb.value

        main_URL = "https://google.com/search?q=" + str(phrase)

        os.remove("keyword.txt")

        SEOProgram.FirstPage.first_page_crawl(main_URL)
        self.load = 10 # the value is supposed to increase after each function
        #self.update_value()
        time.sleep(10)
        SEOProgram.remove_urls()
        self.load = 30
        SEOProgram.InternalLinks.get_internal()
        #time.sleep(10)
        SEOProgram.ExternalLinks.get_external()
        #time.sleep(10)
        SEOProgram.FindImages.get_images()
        #time.sleep(10)
        SEOProgram.WordCounter.count_words()
        #time.sleep(10)
        SEOProgram.WordCounter.show_word_count()

    #def update_value(self, dt=None):
     #   if self.load <= 10000:
      #      self.load += 10
       #     self.ids.pb.value += self.load
        #    self.update_bar()


class SEOLabel(Screen):

    def __init__(self, **kwargs):
        super(SEOLabel, self).__init__(**kwargs)

    main_keyword = ObjectProperty(None)


    def submit(self):
        self.keyword = self.main_keyword.text
        print(self.keyword)
        with open("keyword.txt", "w") as keywordfile:
            keywordfile.write(self.keyword)



class WindowManager(ScreenManager):
    pass


seofile = Builder.load_file("seo.kv")

class SEOApp(App):

    def build(self):
        return seofile



if __name__ == "__main__":
    SEOApp().run()

Ниже приведен файл kv:

WindowManager:
    SEOLabel:
    SecondWindow:
    ThirdWindow:

<SEOLabel>:

    name: "main"
    main_keyword: keyword


    Label:
        text: "Enter Your Keyword Below:"
        font_size: 40
        pos_hint: {'y' : 0.2}

    TextInput:
        id: keyword
        hint_text: "Keyword"
        multiline: False
        width: 200
        size_hint: None, None
        height: 40
        pos: root.width / 2.5, root.height / 2

    Button:
        text: "Access Keyword"
        size_hint: 0.5, 0.2
        pos: root.width / 3.75, root.height / 5
        on_release:
            root.submit()
            app.root.current = "main" if keyword.text == "" else "second"
            root.manager.transition.direction = "left"



<SecondWindow>:

    name: "second"
    pb: pb

    Label:
        text: "Click Button To Get Results"
        font_size: root.width / 30
        pos_hint: {"x" : 0.5, "y" : 0.5}


    ProgressBar:
        id: pb
        size: 200, 200
        max: 100
        value: root.load
        canvas:
            Color:
                rgb: .45, .28, .5
        pos_hint: {"x" : 0.5, "y" : 0.3}

    Button:
        text: "Get Results"
        size_hint: None, None
        pos_hint: {"x" : 0.5, "y" : 0.1}
        on_release:
            root.calculate()



<ThirdWindow>:

    name: "third"

    Button:

        text: "Enter New Keyword?"
        height: 100
        width: 200
        on_release:
            app.root.current = "main"

Что мне делать?

1 Ответ

0 голосов
/ 04 апреля 2020
    self.load = 10 # the value is supposed to increase after each function
    #self.update_value()
    time.sleep(10)
    SEOProgram.remove_urls()
    self.load = 30

time.sleep заставляет программу ... ну спать. Он ничего не делает в это время, включая то, что вы хотите сделать, например, рисование нового состояния индикатора выполнения.

Вместо того, чтобы запускать все по одному в одной длинной функции, которая заблокирует gui рисование до его завершения, используйте Clock.schedule_once(next_func, 0), где next_func - следующая функция, которую вы хотите выполнить. Это запланирует это для следующего кадра, после того, как индикатор выполнения был обновлен. Таким способом вы можете связать столько вещей, сколько захотите.

...