繁体   English   中英

我可以在按钮的文本区域中执行简单的数学加法/减法吗?

[英]Can I perform simple math addition/subtraction in a button's text area in kivy?

我目前正在使用Python和Kivy创建一个简单的应用程序。 我目前有一个按钮,我希望按钮的文本显示其他两个按钮的文本的总和。 我不确定如何做到这一点。

我知道文本:仅接受字符串,因此我尝试使用int()str()希望将文本转换为可以运行的内容。 但是我遇到的错误是

TypeError:'kivy.weakproxy.WeakProxy'对象不可调用

#abilityscore.kv
<AbilityScore@Button>:
    font_size: 32
    color: 0, 0, 0, 1
    size: 50, 50
    background_normal: ''
    background_color: 153, 102, 0, 1

<BlankButton@Button>:
    size: 50, 50
    background_normal: ''
    background_color: 153, 102, 0, 0

<CalcGridLayout>:
    cols: 7
    rows: 7
    padding: 10
    spacing: 10

    AbilityScore:
        id: str
        text: "8"
    AbilityScore:
        id: strmod
        text: "1"
    AbilityScore:
        text: str.text + strmod.text

使用当前的代码

text: str.text + strmod.text

我得到的结果是显示81的按钮,当我将其跳跃为9时。如前所述,我也尝试过

str(int(str.text) + int(strmod.text))

但出现“ TypeError:'kivy.weakproxy.WeakProxy'对象不可调用”错误。 我希望它能找到一种方法,让我有

   AbilityScore:
        id: str
        text: "8"
   AbilityScore:
        id: strmod
        text: "1"
   AbilityScore:
        text: <some code here>

其中<some code here>返回结果9是str.textstrmod.text的总和。

我仔细看了str(int(str.text) + int(strmod.text)) ,您会看到

str (int( str .text) + int(strmod.text))

一旦命名了对象str就可以尝试调用内置函数str Python不再看到该函数,因为它在内部作用域中被同名对象所遮盖。 我认为这就是错误消息告诉您的内容:

TypeError:'kivy.weakproxy.WeakProxy'对象不可调用

结论

因此,简而言之,如果避免名称冲突,应该有可能: *)

    AbilityScore:
        id: a_str
        text: "8"
    AbilityScore:
        id: b_str
        text: "1"
    AbilityScore:
        text: str(int(a_str.text) + int(b_str.text))

*)请记住,字符串可能无法评估为数字。 在给定的情况下,这似乎不是问题,因为text值是由文字提供的。 如果值是在运行时生成的,则必须处理非数字输入,例如, 以PalimPalim所示的方式处理

在此处输入图片说明

你可以做类似的事情

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.label import Label 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.button import Button

class CalcButton(Button):

    @staticmethod
    def to_num(s):
        try:
            float(s)
            return float(s)
        except ValueError:
            return 0

kv_str = Builder.load_string(""" BoxLayout:
    TextInput:
        id: t1
    TextInput:
        id: t2
    CalcButton:
        text: str(self.to_num(t1.text) + self.to_num(t2.text))

""")

class MyApp(App):

    def build(self):
        return kv_str

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

如果将函数to_num导入到kv文件中而不通过类获取,则可以将其设为纯kv。 参见https://kivy.org/doc/stable/guide/lang.html#special-syntax

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM