如何解决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 举报,一经查实,本站将立刻删除。