如何在kivy python中创建一个带有for循环的scrollview,并让每个按钮都有自己的函数param

2024-06-16 10:25:12 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试着创建一个程序,你点击一个按钮,它会从你提供的任务列表中给你一个随机的任务,再给你一个按钮列出所有这些任务。所以代码中没有错误,唯一的问题是当我运行它时,我希望每个按钮调用相同的函数,但根据循环中的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的原因。你知道吗


Tags: infromimportselfaddforsizedef
1条回答
网友
1楼 · 发布于 2024-06-16 10:25:12

问题

I expected the output to print the button's text for each different button, but it only texts the very last item in the task file for each button, which is virtualbox.

I want each button to call the same function but give different parameters depending on the i variable in the loop.

根本原因

打印的文本总是“VIRTUALBOX”,因为它是最后添加的按钮,并且在调用中被but_.text引用。你知道吗

解决方案

要解决此问题,需要以下增强功能。你知道吗

你知道吗主.py你知道吗

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

代码段-主.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

相关问题 更多 >