Kivy访问GridLayou中动态创建的TextInput

2024-10-03 11:16:00 发布

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

相对较新的Python/Kivy/I编程。我可以随意选择一个锻炼项目,但我可以随意选择一个锻炼项目。在

我现在遇到的问题是在手动选择练习的过程中(在下面的编辑工作界面中,只需单击主屏幕上的按钮即可到达)。下面代码的相关部分显示了我想要的内容(目前为止,它由标签和ScrollView/GridLayout中的文本输入组成),但是我很难弄清楚如何访问文本输入中的文本。这段文字代表了每次锻炼的默认持续时间,我希望能够改变这个时间(比如说,如果我想在锻炼期间做一个长/短的特定运动)。我有一个on_text_validate函数,它打印文本输入中的内容,但显然现在它只返回最后一行,因为每行的变量被覆盖,但我需要的是让每个文本输入与适当的练习配对。我已经尝试过使用RecycleView,因为这似乎是一个不错的选择,但是当我试图从动态创建的小部件中获取文本时,还是遇到了一些问题。在

所以我的主要问题是,如何从这些动态创建的小部件访问每个练习的文本输入?在

wotester.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
import pandas as pd


class MainScreen(Screen):
    pass

exercisedict = {'exercise':['Pushups', 'Squats', 'Curls'],'focus':['Chest','Legs','Arms'],'equip':['None','None','Dumbells'], 'deftime':['30','30','40']}
exercisedf = pd.DataFrame(exercisedict)

class EditWorkoutScreen(Screen):

    def setupscreen(self):
        global exercisedf

        for index, row in exercisedf.iterrows():
            def testtext(self):
                print extime.text
            grid = GridLayout(rows=1, spacing=2)
            exname = Label(text=str(row.exercise))
            exfocus = Label(text=str(row.focus))
            exequip = Label(text=str(row.equip))
            extime = TextInput(text=str(row.deftime), size_hint=(None,None), size=(25,30),font_size=11, multiline=False)
            extime.bind(on_text_validate=testtext)

            grid.add_widget(exname)
            grid.add_widget(exfocus)
            grid.add_widget(exequip)
            grid.add_widget(extime)

            self.ids.exercisestoverify.add_widget(grid)


class ScreenManagement(ScreenManager):
    pass

presentation = Builder.load_file("wotester.kv")


class MainApp(App):

    def build(self):
        return presentation


MainApp().run()

瓦特测试仪.kv

^{pr2}$

Tags: textfrom文本importselfnoneaddwidget
1条回答
网友
1楼 · 发布于 2024-10-03 11:16:00

好吧,我在解决我的问题上已经取得了一些进展,我想我的代码工作到一定程度,我可以将它应用到我的整个程序中,并让它做我需要它做的事情(希望如此!)。我对我的.py代码做了一些重要的修改,对kv文件做了一些小的修改,我会把它放在这里,以防它对其他类似情况下的人有所帮助。在

wotester.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
import pandas as pd

exercisedict = {'exercise':['Pushups', 'Squats', 'Curls'],'focus':['Chest','Legs','Arms'],'equip':['None','None','Dumbells'], 'deftime':['30','30','40']}
exercisedf = pd.DataFrame(exercisedict)


class MainScreen(Screen):
    pass


class EditWorkoutScreen(Screen):

    def setupscreen(self):
        for index, row in exercisedf.iterrows():
            MyGrid(str(row.exercise),str(row.focus),str(row.equip),str(row.deftime))

    def addgrids(self):
        global grids
        for i in grids:
            print i.children
            self.ids.exercisestoverify.add_widget(i)

    def printtext(self):
        global grids
        for i in grids:
            print i.extime.text


class ScreenManagement(ScreenManager):
    pass

grids= []
class MyGrid(GridLayout):
    def __init__(self,exname,exfocus,exequip,extime, **kwargs):
        super(MyGrid, self).__init__(**kwargs)
        global grids
        def testtext(self):
            print self.text
        self.exname = Label(text=exname)
        self.exfocus = Label(text=exfocus)
        self.exequip = Label(text=exequip)
        self.extime = TextInput(text=extime, size_hint=(None,None), size=(25,30),font_size=11, multiline=False)
        self.extime.bind(on_text_validate=testtext)

        self.add_widget(self.exname)
        self.add_widget(self.exfocus)
        self.add_widget(self.exequip)
        self.add_widget(self.extime)

        grids.append(self)


presentation = Builder.load_file("wotester.kv")


class MainApp(App):

    def build(self):
        return presentation


MainApp().run()

瓦特测试仪.kv

^{pr2}$

所以现在在进入EditWorkout屏幕时,我的setupscreen函数运行,它为我的dataframe中的每个练习实例化一个自定义的GridLayout(MyGrid),然后将其附加到一个列表(grids)中。然后,我通过addgrids函数将grids列表中的每个对象添加到已经显示在屏幕上的GridLayout中,现在我可以从EditWorkout屏幕下添加的printtext函数中获取每个textinput的值,方法是使用grids列表来选择我想要的textinput。在

主要的关键是创建定制的GridLayout类,用我需要的所有变量/小部件初始化它,并将每个自定义对象添加到一个列表中,以便在需要时遍历该列表并获取必要的textinput文本。在

我想有更好的方法来实现这一点(也许用RecycleView?)所以如果其他人有任何想法或建议,请告诉我!在

相关问题 更多 >