如何使用for循环在kivy python中创建滚动视图并使每个按钮具有自己的函数参数

时间:2019-06-26 04:47:43

标签: python button kivy

因此,我试图创建一个程序,在其中单击一个按钮,它会从您提供的任务列表中为您提供一个随机任务,并在另一个按钮中列出所有这些任务。因此,代码中没有错误,唯一的问题是,当我运行它时,我希望每个按钮都调用相同的函数,但根据循环中的i变量提供不同的参数。我也拿出了获取任务的按钮,因为这与问题没有任何关系。

GUI代码:

#imports
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.scrollview import ScrollView
from kivy.uix.textinput import TextInput
import Functions
import sys
import time



class Home(FloatLayout):
#function that setups the first page
    def setup(self, obj):
        self.clear_widgets()

        List = Button(
        text="Your List",
        font_size=20,
        size_hint=(1/6, 1/12),
        pos_hint={"x":2.5/6, "y":1/6},
        on_press = self.LIISST
        )




        self.add_widget(List)



#function that lists tasks
    def LIISST(self, obj):
        self.clear_widgets()
        FUNC_ = Functions.Choose_("GE", 5)
        FUNC_.sort()

        LT = GridLayout(
        cols=1,
        spacing=10,
        size_hint_y=None,
        )
        LT.bind(minimum_height=LT.setter('height'))

        SCR = ScrollView(
        size_hint=(1/3.5, 2/3),
        pos=(self.width*137/384, self.height/3.25)
        )



        for i in range(len(FUNC_)):
            but_ = Button(text=str(FUNC_[i]),
            size_hint=(18/20, None),
            height=40,
            font_size=self.width/75,
            on_press=lambda s:Functions.Choose_("DE", but_.text)
            )

            LT.add_widget(but_)
        SCR.add_widget(LT)



        ACC_ = Button(
        text="Back",
        font_size=20,
        size_hint=(1/8, 1/14),
        pos_hint={"x":3.5/8, "y":1/6},
        on_press=self.setup
        )


        self.add_widget(SCR)
        self.add_widget(ACC_)



    def __init__(self, **kwargs):
        super(Home, self).__init__(**kwargs)
        Window.clearcolor = (255/255, 255/255, 255/255, 255/255)



        self.setup(self)



class App_(App):

    def build(root):
        return Home()



if __name__ == '__main__':
    App_().run()

获取任务的功能:(单独的文件)

import random
import sys

def Choose_(vall_, VAAL_):
    try:

        #variables
        cfile = open(r"Choice.txt", "r+")
        cfile.seek(0)
        dfile = open(r"Done.txt", "r+")
        dfile.seek(0)
        items = []
        DON = []

        #appenders for items in file to line
        [items.append(line) for line in cfile]
        [DON.append(line) for line in dfile]

        stripp1 = [s.strip() for s in items]
        stripp2 = [s.strip() for s in DON]

        stripp1.sort()
        stripp2.sort()

        if vall_ == "DE":
            print(VAAL_)

        if vall_ == "GE":
            return stripp1
            sys.exit()

        for s in stripp2:
            if s in stripp1:
                stripp1.remove(s)

        if not stripp1:
            dfile.seek(0)
            dfile.truncate(0)
            return False
            sys.exit()


        luck = random.randint(0, (len(stripp1)-1))

        dfile.write(stripp1[luck])
        dfile.write("\n")

        return(stripp1[luck])
    finally:
        cfile.close()
        dfile.close()

任务文件(与上面的代码相同的目录):

ClIP STUDIO PAINT
CYBRARY (HACKING)
CYBRARY (LINUX)
VIRTUAL DJ
RASPBERRY PI
PACKET TRACER
VIRTUALBOX
PHOTOSHOP
BLENDER
SOLIDWORKS
KHAN ACADEMY (ANATOMY)
SOLOLEARN
UNITY
KHAN ACADEMY (ELECTRICAL)
PROGRAMMING
KHAN ACADEMY (PHYSICS)
ADOBE PREMIERE

已经完成的任务(同样,与上述文件位于同一目录):

ClIP STUDIO PAINT
CYBRARY (HACKING)
CYBRARY (LINUX)
VIRTUAL DJ
RASPBERRY PI
PACKET TRACER

我希望输出为每个不同的按钮打印按钮的文本,但是对于每个按钮,它仅将任务文件中的最后一项文本化,即virtualbox。代码还按abc顺序对任务进行排序,这就是为什么最后一项是virtualbox的原因。

1 个答案:

答案 0 :(得分:0)

问题

  

我希望输出为每个按钮打印按钮的文本   按钮,但它仅将每个任务文件的最后一个文本发送文本   按钮,即virtualbox。

     

我希望每个按钮都调用相同的功能,但要赋予不同的功能   参数取决于循环中的i变量。

根本原因

打印的文本始终为“ VIRTUALBOX”,因为它是最后添加的按钮,并且在通话中被but_.text引用。

解决方案

需要以下增强功能才能解决该问题。

main.py

  • 实施一种新方法callback()
  • 将按钮的on_press事件绑定到新方法callback()

代码段-main.py

    for i in range(len(FUNC_)):
        but_ = Button(text=str(FUNC_[i]),
                      size_hint=(18 / 20, None),
                      height=40,
                      font_size=self.width / 75,
                      on_press=self.callback
                      )

        LT.add_widget(but_)
    SCR.add_widget(LT)
    ...

def callback(self, instance):
    print(f"\ncallback: instance={instance}, text={instance.text}")
    Functions.Choose_("DE", instance.text)

输出

Result - Clicked Button RASPBERRYPI