我目前正在使用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
的总和。
答案 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)
您可以做类似的事情
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