Kivy - 進度條



當 GUI 應用程式執行一些耗時的過程時,應該有一些機制讓使用者知道其進度。Kivy 框架中的 Progressbar 元件顯示了正在進行的任務的進度視覺化表示。

Kivy 的進度條元件僅支援水平模式,並在應用程式視窗中以增量進度顯示。

Progressbar 類在 "kivy.uix.progressbar" 模組中定義。

from kivy.uix.progressbar import ProgressBar
pb = Progressbar(**kwargs)

Progressbar 元件是一個只讀元件,沒有任何互動元素,因為它不引發或傳播任何事件。

要建立 Progressbar 的例項,您需要設定其 max 屬性。

from kivy.uix.progressbar import ProgressBar
pb = ProgressBar(max=1000)

該元件具有 value 屬性。您可以將其分配給小於其 "max" 屬性的任何數字。

pb.value=100

但是,由於 progressbar 類沒有任何事件和事件處理程式,我們需要手動將 value 屬性連結到某些過程。

這可以透過定期讀取漸進式任務屬性的瞬時值並更新進度條的 value 屬性來完成。

假設我們有一個長的 for 迴圈,它在每秒後執行下一次迭代。

for i in range(1000):
   time.delay(1)
   print (i)

我們希望在進度條上顯示 I 的增量。因此,我們排程一個時鐘事件,該事件在每秒後呼叫一個函式。

progev = Clock.schedule_interval(update_progress, 1.0)

每秒後,update_progesss() 函式將進度條的 value 屬性更新為迭代計數器 i。

def update_progress():
   pb.value = i

示例

讓我們在以下程式碼中實現此方法。GUI 設計包含兩個按鈕和一個標籤。當按下開始按鈕時,它將 mp3 檔案載入到 Sound 物件中。聲音檔案的長度用作進度條的 max 屬性。

self.sound = SoundLoader.load('sample.mp3')
self.length = self.sound.length

當呼叫 play() 方法時,我們像上面所示排程一個進度事件。

self.prog_ev = Clock.schedule_interval(self.update_progress, 1.0)

update_progress() 方法讀取 Sound 物件的 pos 屬性並使用它來更新進度條的 value 屬性。

def update_progress(self, dt):
   if self.sound.state=='play':
      if self.prg.value < self.length:
         self.progress += 1 # Update value.
         self.prg.value=self.progress

以下是完整程式碼

from kivy.app import App
from kivy.clock import Clock
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.core.audio import SoundLoader
from kivy.uix.progressbar import ProgressBar
from kivy.properties import NumericProperty
from kivy.core.window import Window

Window.size = (720, 400)

class audiodemoapp(App):
   length = NumericProperty(0.0)
   progress = NumericProperty(0.0)

   def build(self):
      layout = GridLayout(cols=1, padding=10)
      self.prg = ProgressBar()
      layout.add_widget(self.prg)
      self.l1 = Label(
         text='Press Start to Play', font_size=40,
         color=[.8, .6, .4, 1]
      )
      layout.add_widget(self.l1)
      box = BoxLayout(orientation='horizontal')
      self.button1 = Button(text="Start", font_size=32)
      self.button2 = Button(
         text='Pause', font_size=32,
         disabled=True
      )
      box.add_widget(self.button1)
      box.add_widget(self.button2)
      layout.add_widget(box)
      self.button1.bind(on_press=self.start_stop)
      self.button2.bind(on_press=self.pause_resume)
      
      return layout

   def start_stop(self, event):
      if self.button1.text == 'Start':
         self.l1.text = 'Playing'
         self.button1.text = 'Stop'
         self.sound = SoundLoader.load('sample.mp3')
         self.length = self.sound.length
         self.pos = 0
         self.button2.disabled = False
         self.sound.play()
         self.prog_ev = Clock.schedule_interval(self.update_progress, 1.0)
      else:
         if self.button1.text == 'Stop':
            self.l1.text = 'Press Start to Play'
            self.sound.state = 'stop'
            self.button1.text = 'Start'
            self.sound.unload()
            self.button2.disabled = True
            self.pos = 0
   
   def pause_resume(self, event):
      if self.button2.text == 'Pause':
         self.button2.text = 'Resume'
         self.l1.text == 'Paused'
         self.pos = self.sound.get_pos()
         self.sound.stop()
      else:
         if self.button2.text == 'Resume':
            self.l1.text = 'Playing'
            self.button2.text = 'Pause'
            print(self.pos)
            self.sound.seek(self.pos)
            self.sound.play()
            self.prog_ev = Clock.schedule_interval(self.update_progress, 1.0)
   def update_progress(self, dt):
      if self.sound.state == 'play':
         if self.prg.value < self.length:
            self.progress += 1 # Update value
            self.prg.value = self.progress
         else: # End case.
            self.progress = 0 # Reset value
            self.prog_ev.cancel() # Stop updating
   
audiodemoapp().run()

輸出

執行以上程式碼。按下開始按鈕。頂部的進度條顯示音樂檔案的瞬時播放位置。

Kivy Progress Bar
廣告
© . All rights reserved.