如何在Python函数中调用Kivy TextInput?

2024-03-29 02:38:35 发布

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

我正在尝试将kivytextinput小部件中的文本输入调用到Python函数中,该函数将对数学进行繁重的处理,并将其输出到TextInput小部件旁边的Label小部件上。你知道吗

我对Kivy很陌生,但是我的教授提到了它,并且一直在搞它能做什么。目前我有一个问题,我试图调用的特定变量不存在。我曾尝试在Kivy代码中运行一个函数,将输入转换为int,以便Python函数调用,但很快就变得一团糟。在我打破之前,我有任何进一步的建议。我不打算包括完整的代码,因为它很长,但这些是正在使用的代码片段。你知道吗

import abilities
import races
import os
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button

class AbilityDisplay(GridLayout):

    def __init__(self, **kwargs):
        super(AbilityDisplay, self).__init__(**kwargs)
        self.cols = 3
        if os.path.isfile("character1.txt"):
            with open("character1.txt", "r") as f:
                d = f.read().split(",")
                character_name = d[0]
                char_str = d[1]

        else:
            character_name = ''
            char_str = ''

        self.add_widget(Label(text = 'Name'))
        self.name = TextInput(text = character_name, multiline = False)
        self.add_widget(self.name)
        self.add_widget(Label())
        self.add_widget(Label(text = 'Strength'))
        self.strength = TextInput(text = char_str, multiline = False) 
        self.add_widget(self.strength)
        self.add_widget(Label(text = str(Player.p_strength())))

        self.save = Button(text = 'Save')
        self.save.bind(on_press = self.save_state)
        self.add_widget(Label())
        self.add_widget(self.save)

    def save_state(self, instance):
        character_name = self.name.text
        char_str = self.strength.text

        print(f"Saving {character_name}.")

        with open("character1.txt", "w") as f:
            f.write(f"{character_name},{char_str}")


class TheApp(App):

    def build(self):
        return AbilityDisplay()


class Player():

    def p_strength():
        strength_input = int(AbilityDisplay.strength())
        racial_bonus = 0
        s_total = strength_input + racial_bonus
        s_modifier = abilities.strength(s_total)
        return s_modifier


if __name__ == '__main__':
    TheApp().run()

还有更多的代码涉及到其他“能力”,数学的代码在我构建的能力模块中。上面的代码是为了从小部件获取玩家输入,并通过player类运行它,player类将调用数学的能力模块。最后一个标签小部件将显示输出编号。如果我输入18作为数学,标签应该显示4。问题是我在启动程序时收到一个错误代码,说AbilityDisplay没有属性。我很难在不完全破坏代码的情况下完成这项工作。你知道吗

对于玩D&D的人来说,这应该看起来很熟悉。你知道吗

编辑:我意识到少了几行。你知道吗


Tags: 代码textnamefromimportselfadd部件
1条回答
网友
1楼 · 发布于 2024-03-29 02:38:35

根本原因-非类型错误

Label小部件的实例化过程中,它试图通过调用p_strength()方法来填充Label的文本,但Kivy尚未完成其构建过程。因此,属性的值为None。你知道吗

解决方案-结合强度/text输入

解决方案是进行以下增强。你知道吗

类能力显示(GridLayout)

  • 使用on_text_validate(当播放器按“回车”键时)事件绑定strength/TextInput以调用新方法on_enter()
  • 实现一个新方法on_enter()来调用p_strength()方法
  • 实例化Label小部件并将其分配给self.result
  • self.result替换Label(text = str(Player.p_strength()))

方法p\U强度()

  • p_strength()方法添加参数selfstrength
  • strength替换AbilityDisplay.strength()

片段

class AbilityDisplay(GridLayout):

    def __init__(self, **kwargs):
        super(AbilityDisplay, self).__init__(**kwargs)
        self.cols = 3
        ...
        self.add_widget(Label(text='Strength'))
        self.strength = TextInput(text=char_str, multiline=False)
        self.strength.bind(on_text_validate=self.on_enter)
        self.add_widget(self.strength)

        self.result = Label()
        self.add_widget(self.result)
        ...

    def on_enter(self, instance):
        # update result's text
        self.result.text = str(Player().p_strength(instance.text))
...
class Player():

    def p_strength(self, strength):
        strength_input = int(strength)
        racial_bonus = 0
        s_total = strength_input + racial_bonus
        s_modifier = abilities.strength(s_total)
        return s_modifier

相关问题 更多 >