2017-02-16 51 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