Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过'将文本插入文本输入;关于<;房地产>';回拨_Python_User Interface_Kivy_Textinput - Fatal编程技术网

Python 如何通过'将文本插入文本输入;关于<;房地产>';回拨

Python 如何通过'将文本插入文本输入;关于<;房地产>';回拨,python,user-interface,kivy,textinput,Python,User Interface,Kivy,Textinput,我正在使用kivy制作一个简单的计算器,并尝试在屏幕上使用TextInput。我不确定是哪个 在TextInput或Label之间会更好,但是TextInput似乎是更好的选择(也许我错了?)。 GUI基本上已经就位,所有按钮都有各自的文本字段('0'、'1'、'2'、'+'、'='…等等)。每次 用户按下按钮时,该按钮中的文本将添加到计算字符串中,当按下“=”按钮时, 将被“评估”。从本质上说,这一切都正常,但我的输出都被打印到控制台,因为我无法获取字符串 插入TextInput屏幕。我试图在

我正在使用kivy制作一个简单的计算器,并尝试在屏幕上使用
TextInput
。我不确定是哪个 在
TextInput
Label
之间会更好,但是
TextInput
似乎是更好的选择(也许我错了?)。 GUI基本上已经就位,所有按钮都有各自的文本字段(
'0'、'1'、'2'、'+'、'='
…等等)。每次 用户按下按钮时,该按钮中的文本将添加到
计算字符串中
,当按下“=”按钮时, 将被“评估”。从本质上说,这一切都正常,但我的输出都被打印到控制台,因为我无法获取字符串 插入
TextInput
屏幕。我试图在由触发的回调(
screen\u callback
)内设置
TextInput
的文本 绑定到
TextInput
on\u属性
方法。它不起作用了。我怎样才能做到这一点?可能吗

main.py:

#!/usr/bin/env python

import kivy
kivy.require('1.8.0')
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.properties import ListProperty, ObjectProperty, StringProperty, NumericProperty

class Screen(TextInput):
    pass

class Calculator(BoxLayout):

    function_btns = ListProperty(['+', '-', '*', '/', '^', 'Mem <-', 'Mem ->', 'Clear'])
    digit_btns = ListProperty(['7', '8', '9', '4', '5', '6', '1', '2', '3', '0', '.', '+/-'])
    eval_string = StringProperty() # one of these strings is probably unnecessary
    calc_string = StringProperty()
    result = NumericProperty(0)

    def build_calc(self):
        # add screen textinput
        self.add_widget(Screen(text='0', multiline=False, on_calc_string=self.screen_callback))

        #create inner boxlayout to hold 2 button gridlayouts
        main_buttons_box = BoxLayout(orientation='horizontal', size_hint=(1, 0.75))

        # create 2 button gridlayouts
        digit_grid = GridLayout(cols=3, rows=4, size_hint=(0.5, 1))
        function_grid = GridLayout(cols=1, size_hint=(0.5, 1))

        # populate grids with buttons
        for i in self.digit_btns:
            digit_grid.add_widget(Button(text=str(i), on_press=self.button_callback))

        for f in self.function_btns:
            function_grid.add_widget(Button(text=str(f), on_press=self.button_callback))

        # add grids to inner boxlayout
        main_buttons_box.add_widget(digit_grid)
        main_buttons_box.add_widget(function_grid)

        # add inner boxlayout to main grid(root)
        self.add_widget(main_buttons_box)

        # finally, add boxlayout at bottom of main grid and insert equals btn
        equals_box = BoxLayout(size_hint=(1, 0.25))
        equals_box.add_widget(Button(text='=', on_press=self.button_callback))
        self.add_widget(equals_box)

    def button_callback(self, instance):
        value = instance.text
        if value == '=':
            try:
                self.result = eval(self.eval_string)
                self.calc_string = str(self.result)
                self.eval_string = ''
            except SyntaxError:
                self.calc_string = 'Error: Invalid Input'
        else:
            self.eval_string += value
            self.calc_string = self.eval_string

        print self.calc_string

    def screen_callback(self, instance):
        instance.text = self.calc_string # not working
        print 'seeing this!!!' # not working


class CalcApp(App):

    def build(self):
        calc = Calculator()
        calc.build_calc()
        return calc

if __name__ == '__main__':
    CalcApp().run()
#kivy: 1.0

<Screen>:
    size_hint: 1, 0.25

<Calculator>:
    orientation: 'vertical'
#/usr/bin/env python
进口克维
kivy.require('1.8.0')
从kivy.app导入应用程序
从kivy.uix.widget导入widget
从kivy.uix.gridlayout导入gridlayout
从kivy.uix.boxlayout导入boxlayout
从kivy.uix.label导入标签
从kivy.uix.button导入按钮
从kivy.uix.textinput导入textinput
从kivy.properties导入ListProperty、ObjectProperty、StringProperty、NumericProperty
类屏幕(文本输入):
通过
类计算器(BoxLayout):
函数_btns=ListProperty(['+','-','*','/','^',Mem',Clear']))
Digital_btns=ListProperty(['7'、'8'、'9'、'4'、'5'、'6'、'1'、'2'、'3'、'0'、'、'、'+/-']))
eval_string=StringProperty()#这些字符串中的一个可能是不必要的
calc_string=StringProperty()
结果=数值属性(0)
def构建计算(自身):
#添加屏幕文本输入
self.add_小部件(Screen(text='0',multiline=False,on\u calc\u string=self.Screen\u回调))
#创建内部boxlayout以容纳2个按钮网格布局
主按钮框=框布局(方向=水平,大小提示=(1,0.75))
#创建2个按钮网格布局
数字网格=网格布局(cols=3,行=4,大小提示=(0.5,1))
函数\网格=网格布局(cols=1,大小\提示=(0.5,1))
#用按钮填充网格
对于self.digit\u BTN中的i:
digit\u grid.add\u小部件(按钮(text=str(i),on\u press=self.Button\u回调))
对于自功能\u BTN中的f:
函数\u grid.add\u小部件(按钮(text=str(f),on\u press=self.Button\u回调))
#将轴网添加到内部boxlayout
主按钮框。添加小部件(数字网格)
主按钮框。添加小部件(功能网格)
#将内部boxlayout添加到主栅格(根)
添加小部件(主按钮框)
#最后,在主网格底部添加boxlayout并插入等于btn的内容
等于盒子=盒子布局(大小提示=(1,0.25))
equals_box.add_小部件(按钮(文本='=',在按=self.Button_回调时))
self.add_小部件(等于_框)
def按钮_回调(自身,实例):
value=instance.text
如果值=='=':
尝试:
self.result=eval(self.eval\u字符串)
self.calc_string=str(self.result)
self.eval_字符串=“”
除SyntaxError外:
self.calc_字符串='错误:无效输入'
其他:
self.eval_字符串+=值
self.calc_字符串=self.eval_字符串
打印self.calc_字符串
def屏幕_回调(自身,实例):
instance.text=self.calc#字符串#不工作
打印“看到这个!!!”不起作用
课程名称(应用程序):
def生成(自):
计算器
计算建造(计算)
返回计算
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
CalcApp().run()
kv文件:

#!/usr/bin/env python

import kivy
kivy.require('1.8.0')
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.properties import ListProperty, ObjectProperty, StringProperty, NumericProperty

class Screen(TextInput):
    pass

class Calculator(BoxLayout):

    function_btns = ListProperty(['+', '-', '*', '/', '^', 'Mem <-', 'Mem ->', 'Clear'])
    digit_btns = ListProperty(['7', '8', '9', '4', '5', '6', '1', '2', '3', '0', '.', '+/-'])
    eval_string = StringProperty() # one of these strings is probably unnecessary
    calc_string = StringProperty()
    result = NumericProperty(0)

    def build_calc(self):
        # add screen textinput
        self.add_widget(Screen(text='0', multiline=False, on_calc_string=self.screen_callback))

        #create inner boxlayout to hold 2 button gridlayouts
        main_buttons_box = BoxLayout(orientation='horizontal', size_hint=(1, 0.75))

        # create 2 button gridlayouts
        digit_grid = GridLayout(cols=3, rows=4, size_hint=(0.5, 1))
        function_grid = GridLayout(cols=1, size_hint=(0.5, 1))

        # populate grids with buttons
        for i in self.digit_btns:
            digit_grid.add_widget(Button(text=str(i), on_press=self.button_callback))

        for f in self.function_btns:
            function_grid.add_widget(Button(text=str(f), on_press=self.button_callback))

        # add grids to inner boxlayout
        main_buttons_box.add_widget(digit_grid)
        main_buttons_box.add_widget(function_grid)

        # add inner boxlayout to main grid(root)
        self.add_widget(main_buttons_box)

        # finally, add boxlayout at bottom of main grid and insert equals btn
        equals_box = BoxLayout(size_hint=(1, 0.25))
        equals_box.add_widget(Button(text='=', on_press=self.button_callback))
        self.add_widget(equals_box)

    def button_callback(self, instance):
        value = instance.text
        if value == '=':
            try:
                self.result = eval(self.eval_string)
                self.calc_string = str(self.result)
                self.eval_string = ''
            except SyntaxError:
                self.calc_string = 'Error: Invalid Input'
        else:
            self.eval_string += value
            self.calc_string = self.eval_string

        print self.calc_string

    def screen_callback(self, instance):
        instance.text = self.calc_string # not working
        print 'seeing this!!!' # not working


class CalcApp(App):

    def build(self):
        calc = Calculator()
        calc.build_calc()
        return calc

if __name__ == '__main__':
    CalcApp().run()
#kivy: 1.0

<Screen>:
    size_hint: 1, 0.25

<Calculator>:
    orientation: 'vertical'
#kivy:1.0
:
尺寸提示:1,0.25
:
方向:“垂直”

您的
屏幕
小部件没有
计算字符串
属性,因此计算字符串上的
在此不执行任何操作:

self.add_widget(Screen(text='0', multiline=False, on_calc_string=self.screen_callback))
您需要使用
计算器
进行绑定。Kivy有一个有用的
setter
方法来帮助实现这一点:

scr = Screen(text='0', multiline=False)
self.add_widget(scr)
self.bind(calc_string=scr.setter('text'))
而且,kv语言使这变得更容易。您可以在kv中定义整个小部件布局。。。我不会重构您的整个小部件,但这里有一个示例:

<Calculator>:
    orientation: 'vertical'

    Screen:
        text: root.calc_string
:
方向:“垂直”
屏幕:
文本:root.calc\u字符串

root
指规则中的root小部件,此处为
Calculator
。无论何时修改
root.calc\u字符串
屏幕
文本
属性都将自动更新。

FYI-
屏幕
是一个标准的Kivy小部件,因此您应该避免在自己的小部件中使用该名称。