1
\$\begingroup\$

I made a kivy app to find the rhyming words for a word entered by the user. It displays all the rhyming words as OneLineListItems in a kivy RecycleView. On clicking on one of these OneLineListItems it uses PyDictionary to display a few definitions of the word on the right-hand side of the screen, within an MDBoxLayout. Everything works fine but the definition takes a bit too long to appear in the MDBoxLayout. Any ideas of how to speed this up? Code below:

from kivymd.app import MDApp
from kivy.lang import Builder
from kivymd.uix.label import MDLabel
from kivymd.uix.list import OneLineListItem
import pronouncing
import enchant
from PyDictionary import PyDictionary

dictionary = PyDictionary()
d = enchant.Dict("en_US")

kv = """
Screen:
    input:input
    scroll:scroll
    defs:defs
    MDGridLayout:
        rows: 1
        cols: 2
        MDGridLayout:
            rows: 2
            cols: 1
            MDFloatLayout:
                MDTextField:
                    id:input
                    size_hint: (.4, None)
                    height: 26
                    multiline: False
                    on_text_validate: app.rhyme()
                    hint_text: "Search"
                    mode: "rectangle"
                    pos_hint: {"center_x": .25, "center_y": .85}
                    font_name: "DejaVuSans.ttf"
                    text_size: self.size
            MDFloatLayout:
                RecycleView:
                    id: scroll
                    size_hint: 0.8,1.5
                    bar_width: dp(15)
                    bar_height: dp(40)
                    scroll_type: ["content"]
                    pos_hint: {"center_x": 0.45, "center_y": 0.85}
                    viewclass: "ListItem"
                    RecycleBoxLayout:
                        default_size: None, dp(48)
                        default_size_hint: 1, None
                        size_hint_y: None
                        height: self.minimum_height
                        orientation: 'vertical'
                
        
        MDBoxLayout:
            id:defs
            orientation: "vertical"

"""


class ListItem(OneLineListItem):
    pass


class RhymeApp(MDApp):
    played = []
    x_turn = True

    def build(self):
        self.screen = Builder.load_string(kv)
        return self.screen

    def rhyme(self):
        raw_rhymes = pronouncing.rhymes(self.screen.input.text)
        rhymes = []
        [rhymes.append(x) for x in raw_rhymes if x not in rhymes and x[-1] != "." and d.check(x)]
        self.screen.scroll.data = [
            {"text": f"{i}".capitalize()}
            for i in rhymes]

    def dictionary(self, btn):
        nl = '\n'
        self.screen.defs.clear_widgets()
        self.screen.word.text = btn.text.capitalize()
        meaning = dictionary.meaning(btn.text, disable_errors=True)
        if meaning is None:
            self.screen.defs.add_widget(
                MDLabel(text=f"Sorry, no meaning for that word.",
                        text_size="self.size")
            )
        else:
            for key in meaning:
                self.screen.defs.add_widget(
                    MDLabel(text=f"Part of speech: {key} {nl}Meaning: {nl}{nl}{meaning[key][0].capitalize()}.",
                            text_size="self.size")
                )


if __name__ == "__main__":
    RhymeApp().run()
\$\endgroup\$
1
  • \$\begingroup\$ Welcome to Code Review! I changed the title so that it describes what the code does per site goals: "State what your code does in your title, not your main concerns about it.". Please check that I haven't misrepresented your code, and correct it if I have. \$\endgroup\$ Commented Jan 26, 2022 at 15:23

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.