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

时间:2019-09-05 08:40:16

标签: python kivy kivy-language

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

我知道文本:仅接受字符串,因此我尝试使用private int oldScrollYPostion = 0; // inside your class mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { if (mScrollView.getScrollY() > oldScrollYPostion) { fab.hide(); } else if (mScrollView.getScrollY() < oldScrollYPostion || mScrollView.getScrollY() <= 0) { fab.show(); } oldScrollYPostion = mScrollView.getScrollY(); } }); int()希望将文本转换为我可以运行的内容。但是我遇到的错误是

  

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

str()

使用当前代码

#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

我得到的结果是显示81的按钮,当我将其跳跃为9时,正如我之前尝试过的那样

text: str.text + strmod.text

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

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

其中 AbilityScore: id: str text: "8" AbilityScore: id: strmod text: "1" AbilityScore: text: <some code here> 返回9的结果是<some code here>str.text的总和。

2 个答案:

答案 0 :(得分:1)

我仔细观察了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值是由文字提供的。如果这些值是在运行时生成的,则必须处理非数字输入,例如,以shown by PalimPalim的方式处理。

答案 1 :(得分:0)

enter image description here

您可以做类似的事情

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