Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在回调时替换Kivy小部件?_Python_Oop_Widget_Kivy - Fatal编程技术网

Python 如何在回调时替换Kivy小部件?

Python 如何在回调时替换Kivy小部件?,python,oop,widget,kivy,Python,Oop,Widget,Kivy,我不熟悉Python和Kivy,我正在尝试创建盲文字母的多页显示,每一页都有相应的盲文字母图片。我真的很想了解更多关于创建Kivy桌面应用程序的信息。我真的希望你能帮助我。我想做的是让页面看起来像这样: 我知道图像和按钮是如何在KV文件中根据大小和位置进行放置和定制的。然而,我需要学习的是add_widget()和clear_widget()将如何考虑这一点。我读过Kivy文档,但它们几乎没有解释我如何实现我所需要的。我想做的是使用kivy.uix.screenmanager中的导入screen

我不熟悉Python和Kivy,我正在尝试创建盲文字母的多页显示,每一页都有相应的盲文字母图片。我真的很想了解更多关于创建Kivy桌面应用程序的信息。我真的希望你能帮助我。我想做的是让页面看起来像这样:

我知道图像和按钮是如何在KV文件中根据大小和位置进行放置和定制的。然而,我需要学习的是
add_widget()
clear_widget()
将如何考虑这一点。我读过Kivy文档,但它们几乎没有解释我如何实现我所需要的。我想做的是使用kivy.uix.screenmanager中的
导入screenmanager,Screen
功能,然后只需创建26个屏幕,并通过kv文件中的点击发送它们。但这既单调又过于手工。以下是我目前的代码:

class LetterAScreen(Screen):
    pass

class LetterBScreen(Screen):
    pass

class LetterCScreen(Screen):
    pass

class LetterDScreen(Screen):
    pass

class LetterEScreen(Screen):
    pass

class LetterFScreen(Screen):
    pass

class LetterGScreen(Screen):
    pass

 #.... so and so until Letter Z




sm = ScreenManager(transition=SwapTransition())

#LearnScreen - Alphabet
sm.add_widget(LetterAScreen(name='lettera'))
sm.add_widget(LetterBScreen(name='letterb'))
sm.add_widget(LetterCScreen(name='letterc'))
sm.add_widget(LetterDScreen(name='letterd'))
sm.add_widget(LetterEScreen(name='lettere'))

sm.add_widget(LetterFScreen(name='letterf'))
sm.add_widget(LetterGScreen(name='letterg'))
sm.add_widget(LetterHScreen(name='letterh'))
sm.add_widget(LetterIScreen(name='letteri'))
sm.add_widget(LetterJScreen(name='letterj'))
sm.add_widget(LetterKScreen(name='letterk'))
sm.add_widget(LetterLScreen(name='letterl'))

sm.add_widget(LetterMScreen(name='letterm'))
sm.add_widget(LetterNScreen(name='lettern'))
sm.add_widget(LetterOScreen(name='lettero'))
sm.add_widget(LetterPScreen(name='letterp'))
sm.add_widget(LetterQScreen(name='letterq'))
sm.add_widget(LetterRScreen(name='letterr'))

sm.add_widget(LetterSScreen(name='letters'))
sm.add_widget(LetterTScreen(name='lettert'))
sm.add_widget(LetterUScreen(name='letteru'))
sm.add_widget(LetterVScreen(name='letterv'))
sm.add_widget(LetterWScreen(name='letterw'))
sm.add_widget(LetterXScreen(name='letterx'))
sm.add_widget(LetterYScreen(name='lettery'))
sm.add_widget(LetterZScreen(name='letterz'))

我还没有绕过kv文件,因为我不知道这将如何实现。我需要做的是创建一个小部件或函数,当单击next/按钮时,它将交换当前字母的图像,并显示下一个或上一个字母的图像,而无需每次切换屏幕。我对Kivy和Python中函数的工作方式非常陌生。我希望你能帮助我。谢谢。

这是解决您问题的简单方法。我将把它留给您来修改,使其外观和工作方式完全符合您的需要:)

学习kv语言非常有用、简单,而且可以很快学会

main.py

from kivy.app import App

class MainApp(App):
    alphabet = 'abcdefghijklmnopqrstuvwxyz'

    def next_letter(self):
        # Get a reference to the widget that shows the letters
        # self.root refers to the root widget of the kv file -- in this case,
        # the GridLayout
        current_letter_widget = self.root.ids['the_letter_label']
        # Get the letter currently shown
        current_letter = current_letter_widget.text
        # Find the next letter in the alphabet
        next_letter_index = self.alphabet.find(current_letter) + 1
        next_letter = self.alphabet[next_letter_index]

        # Set the new letter in the widget that shows the letters
        current_letter_widget.text = next_letter

MainApp().run()
main.kv

GridLayout: # This is the `root` widget of the main app class
    cols: 1
    Label:
        text: "g"
        id: the_letter_label # Setting an id for a widget lets you refer to it later
    Button:
        text: "Previous"
    Button:
        text: "Next"
        on_release:
            # the keyword `app` references the main app class, so we can call
            # the `next_letter` function
            app.next_letter()

如果您有具体问题,我很乐意回答。

谢谢您的帮助!它澄清了一些事情。我有几个问题。字母表变量的用途是什么?此外,如果我每个字母/页面有多个小部件,这是否意味着我必须单独为它们分配id并逐个调用它们,或者我可以在kv中分配某种集合id,它可以包含多个项目,例如标签和图像等,并改为调用它。一个新手很抱歉这么慢。1)字母表变量只是为了让我在单击应该显示下一个字母的按钮时知道字母表中的下一个字母。2) 通常我有每个小部件的ID。您可以创建一个您所称的“集合项”-这里可以看到一个示例(不是问题的要点):“集合项”将是该示例中的MCQLabelCheckBox,设置
text
字段我相信将更改MCQLabel中的文本,该文本具有
text:root.text