Kivy:如何从动态创建的布局跟踪按钮点击

如何解决Kivy:如何从动态创建的布局跟踪按钮点击

我在 Kivy Carousel 上有许多布局 - 其中一些是从 .ini 文件动态生成的“调查”。

每个布局都有一个问题和任意数量的多个答案。我有一个通过 Kivy 生成 GUI 元素的工作框架,但我正在尝试找出响应点击的最佳 Python 方式。

现在,我在每个按钮上有 2 个绑定,用于增加计数器并移动到下一张幻灯片 - 但我正在尝试找到一种方法,根据按下的按钮发生不同的操作。

这是因为某些调查需要“运行”总分,因此根据单击的按钮,总分会增加(例如)1、2、3、4 或 5 分。然后有不同的动作,例如在调查结束时将结果提交到数据库

我正在考虑使用动态代码生成来构建所需的方法,但这可能会使事情变得过于复杂。

我可以有一个“监控”线程,它不断检查哪个轮播幻灯片处于活动状态 - 然后将命令绑定到按钮 - 但这似乎不雅。

真的只是希望得到关于使用 python 的哪些特性来达到预期效果以及如何处理的指针。

预先感谢任何可以提供帮助的人。

和平,塞塔

class Question:
    def __init__ (self,question,answers,delimiter,qPos,aPos,slideName):
        self.question = question
        self.delimiter = delimiter
        self.slideName = slideName
        self.answers = answers.split(delimiter)
        self.qPos = []
        [ self.qPos.append ( int(qPos) ) for qPos in qPos.split(',')  ]
        self.aPos = []
        [ self.aPos.append ( int(aPos) ) for aPos in aPos.split(',')  ]
        self.ansHeight = self.aPos [3] / len(self.answers)
        print ( 'each a is ',self.ansHeight,' high' )
        
    def add_buttons (self,slide):
        button = PodApp.MyLabel ( [self.qPos[0],self.qPos[1],self.qPos[2],self.qPos[3]],txt=self.question,ML=True,BG=label_bg_col,FG=label_fg_col )
                
        slide.add_widget(button)
        for i,Q in enumerate (self.answers):
            button = PodApp.MyButton (
                    [self.aPos[0],self.aPos[1] + int(i*self.ansHeight),self.aPos[2],self.ansHeight+3],txt=self.answers[i],col=btn_visible)
            button.bind ( on_press = Survey.Ans )
            button.bind ( on_press = PodApp.carousel.load_next)
            slide.add_widget(button)
    
class Survey:
    
    running_total = 0
    
    def add_buttons ( self,slide ):
        try: self.questions[self.Q_ptr].add_buttons ( slide )
        except IndexError: self.finished = True
        
    @classmethod
    def Ans (cls,btn_num):
        cls.running_total+=1
        print ('New running Total',cls.running_total )
                
    def __init__ (self,src):
        
        self.finished = False
        
        self.Q_ptr = 0
        basename = src
        surveyFile = _surveys + '/' + src + '.ini'
        print ( ' building survey from ',surveyFile )
        
        self.questions = []
        
        print ("survey file is ",surveyFile )
        
        if not path.exists (surveyFile):
            self.valid = 0
            return
            
        print ( ' survey file was there' )
                    
        survey = configparser.ConfigParser()
        survey.read ( surveyFile )
        
        delimiter = survey['General']['Delimiter']
        aPos = survey['General']['aPos']
        qPos = survey['General']['qPos']
        
        for i in itertools.count(1):
            i=str(i)
            print ( 'appending new question',i )
            
            try: self.questions.append (Question (
                    survey[i]['Question'],survey[i]['Answers'],basename+'-'+i))
            except KeyError:
                print ( "Not adding Question ",i )
                break
                    
            print (self.questions)
            
        print ( "made survey valid" )
        self.valid = 1

class PodApp(App):
    
    carousel = MyCarousel(direction='right',scroll_timeout=0)
    
    @classmethod
    def MyButton(cls,pos,action=None,txt='',col=btn_invisible):
        if action==None: action=cls.carousel.load_next      # can only reference self in body
        pos = Sizer.size ( pos )
        return Button ( on_press=action,text=txt,background_color=col,font_size=txt_font_size,pos_hint={'x':pos[0],'y':pos[1]},size_hint=(pos[2],pos[3]))

    def build(self):
        self.title = _title
        self.slides = dict()
        survey=None

        for src in slides:
            print('processing slide',src)
            button,image = None,None
            slide = FloatLayout()
            imageFile = _slidebase + '/' + src + '.png'
                                
            if path.exists (imageFile):
                image = AsyncImage(source=imageFile,allow_stretch=True,keep_ratio=False )
                slide.add_widget(image)
            
            # This bit needs cleaning up!
            if survey == None: survey = Survey (src)
            if survey.valid == 1:
                print ('We got a survey',survey)
                survey.add_buttons(slide)
                if survey.finished: survey=None
                else: self.carousel.add_widget(slide)
            else:
                print ('SURVEY IS INVALID')
                survey = None
            
            self.slides[src] = slide

            try:
                slide.add_widget(button)
                self.carousel.add_widget(slide)
            except  (WidgetException,AttributeError):
                print ( "Not adding!" )
            
        return self.carousel

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?