2017-02-16 54 views
1

我是新的基維,但我有與Python和Tkinter的體面經驗。我試圖以編程方式控制kivy中的旋轉木馬。從本質上講,我有一個外部Python程序,我想用它來自動切換輪播中的圖像。打一個比方,我有一些代碼在另一個文件:以編程方式控制基維的旋轉木馬

import time 

while True: 
    time.sleep(1) 
    #do something to control the carousel 

,然後我有我的kivy應用:

import kivy 
from kivy.app import App 
from kivy.uix.carousel import Carousel 
from kivy.uix.image import AsyncImage 

class CarouselApp(App): 
    self.srcs = ["https://stackoverflow.com/a/bunch.png", "/of/paths.jpg", "/to/images.png."] 

    def build(self): 
     self.carousel = Carousel(direction="right") 
     for i in range(0, len(self.srcs)): 
      src = self.srcs[i] 
      image = AsyncImage(source=src, allow_stretch=True) 
      self.carousel.add_widget(image) 
     return self.carousel 

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

我希望能夠控制該滑塊顯示在轉盤使用最上面的代碼,但我不知道如何去做這件事,因爲我不能執行任何事情後App.run() 我調查了基維的Clock模塊,但我不知道這對我來說會工作,因爲我想在滿足某些條件而不是按時間切換幻燈片時。我給出的時間例子只是我思路的一個例子。

任何幫助將不勝感激!

+0

你想爲旋轉木馬的每個元素添加一個源? – lmiguelvargasf

+0

我不完全確定你的意思。技術上,圖像文件的來源在旋轉木馬被初始化之前都是已知的。我想要做的是在carouselapp創建完成後,在上面的代碼中滿足外部條件後,我想在轉盤中切換幻燈片。我基本上想運行'Carousel.load_next()',但我想從傳送帶應用程序之外完成。 – Taira

+0

我提供了一個答案,我希望這可以幫助。最後,您必須在'on_start'方法中安排一個函數,然後控制該函數的傳送帶。 – lmiguelvargasf

回答

0

我強烈建議使用Kivy文件來處理這種情況。其次,當您要使用將從互聯網上下載的圖像時使用AsyncImage,並且正如我看到的,您將使用的圖像將在本地存儲,因此請使用Image

我想你應該實現該方法on_start其中(在這種情況下CarouselApp)擴展App類和計劃使用Clock作爲一個功能,

def on_start(self): 
    Clock.schedule_interval(self.my_callback, 1) 

然後在同一類(CarouselApp),你應該定義my_callback

def my_callback(self, nap): 
    if condition_is_satisfied: # this is supposed to be your condition 
     # control carousel 
+0

'AsyncImage'是我之前做的一件事。我打算改變它,對不起。我使用'Clock'的問題在於,只有在滿足某個外部條件時才控制旋轉木馬的回調。我想我需要先開發應用程序的其他部分,然後才能對我有意義。 – Taira

+0

@泰拉,那是什麼狀況?它是一個按下按鈕'Clock'用於處理週期性事件,所以你能解釋一下如何觸發這個條件嗎? – lmiguelvargasf

+0

它可以是按鈕按下,但不一定。這很難解釋,但我想我已經開始瞭解實際情況,我想我在學習tkinter的時候也遇到了同樣的問題。 XD你無法從外面控制'CarouselApp',因爲在一天結束時,kivy會表現爲一個大循環,你不能打斷這個循環或者kivy死亡。因此,我的應用程序的外部部分必須被集成到'CarouselApp'類中。我會給它一個去,如果它有效,我會告訴你。 – Taira