簡體   English   中英

如何使用 for 循環在 kivy python 中創建滾動視圖並使每個按鈕都有自己的功能參數

[英]How do you create a scrollview in kivy python with for loop and have each button their own function parameter

所以我試圖創建一個程序,你點擊一個按鈕,它會從你提供的任務列表中隨機提供一個任務,另一個按鈕列出所有這些任務。 所以代碼中沒有錯誤,唯一的問題是當我運行它時,我希望每個按鈕都調用相同的函數,但根據循環中的 i 變量給出不同的參數。 我還取出了獲取任務的按鈕,因為它與問題沒有任何關系。

圖形界面代碼:

#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 的原因。

問題

我希望輸出為每個不同的按鈕打印按鈕的文本,但它只為每個按鈕顯示任務文件中的最后一項,即 virtualbox。

我希望每個按鈕都調用相同的函數,但根據循環中的 i 變量給出不同的參數。

根本原因

打印的文本始終為“VIRTUALBOX”,因為它是添加的最后一個按鈕,並且在調用中被but_.text

解決方案

需要以下增強功能來解決該問題。

主文件

  • 實現一個新方法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)

輸出

結果 - 單擊按鈕 RASPBERRYPI

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM