【问题标题】:How To Replace Kivy Widgets On Callback?如何在回调中替换 Kivy 小部件?
【发布时间】:2019-04-05 14:33:08
【问题描述】:

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

我知道如何根据 KV 文件中的大小和位置放置和自定义图像和按钮。但是我需要了解的是add_widget()clear_widget() 将如何考虑这一点。我已经阅读了 Kivy 文档,但他们几乎没有解释我如何实现我所需要的。我想做的是使用from kivy.uix.screenmanager import ScreenManager, Screen 功能,然后只需创建26 个屏幕并通过kv 文件中的on_click 将它们路由。但这很乏味且过于手动。到目前为止,这是我的代码:

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 文件,因为我不知道这将如何发展。我需要做的是创建小部件或函数,当单击下一个/按钮时,将交换当前字母的图像并显示下一个或上一个字母的图像,而无需每次切换屏幕。我真的不熟悉函数在 Kivy 和 Python 中的工作方式。我希望你能帮助我。谢谢。

【问题讨论】:

    标签: python oop widget kivy


    【解决方案1】:

    这是解决您问题的简单方法。我会把它留给你来修改,让它看起来和工作完全符合你的要求:)

    学习 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。您可以按您的要求创建一个“集体项目” - 可以在此处看到一个示例(不是问题的重点):stackoverflow.com/questions/48438074/… 在该示例中,“集体项目”将是 MCQLabelCheckBox,并设置 @987654326我相信@字段会更改 MCQLabel 中具有text: root.text 的文本
    猜你喜欢
    • 2014-05-20
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多