Python 在Kivy中输入文本后如何调用函数

Python 在Kivy中输入文本后如何调用函数,python,python-3.x,kivy,Python,Python 3.x,Kivy,我试图在文本输入框中输入字符后调用函数。我尝试绑定,但无论是否输入任何内容,它都会调用它。我从手持式扫描仪获取输入,并将其显示在文本输入框中。然后,我将最终发送,包括其他信息到一个csv文件 main2.py import kivy import subprocess import csv import datetime kivy.require('1.9.0') from kivy.app import App from kivy.uix.boxlayout import BoxLayou

我试图在文本输入框中输入字符后调用函数。我尝试绑定,但无论是否输入任何内容,它都会调用它。我从手持式扫描仪获取输入,并将其显示在文本输入框中。然后,我将最终发送,包括其他信息到一个csv文件

main2.py

import kivy
import subprocess
import csv
import datetime
kivy.require('1.9.0')


from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from kivy.uix.textinput import TextInput
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.behaviors import FocusBehavior
from kivy.uix.label import Label
from kivy.properties import StringProperty
from kivy.lang import Builder
from kivy.core.window import Window





dt = datetime.date.today()
pafa = ''


#presentation = Builder.load_file('utest.kv')

class Barcode(TextInput):
    multiline = False

class PassFail(Label, Widget):
    pass

class UsbApp(App):



    def build(self):

        b= BoxLayout(orientation='vertical')
        t= Barcode(font_size = 50,

                    text="",

                    height=200,

                    background_color = (1,1,1,1)
                    )


        l=Label(text="Hey!",
                font_size=150
                )
        pf = PassFail(text='Pass/Fail',
                    font_size= 50,

                    background_color= (1,0,0,1),
                    color = (1,0,0,1),
                    bold=True
                    )

        t.bind(text = l.setter('text'))

        prompt=Label(text='Plug in device')

        b.add_widget(prompt)        
        b.add_widget(t)
        b.add_widget(pf)


        t.bind(text=Clock.schedule_once(self.run_test, 2))
        return b

    def detect(self):
        #detect when device is plugged in
        pass
        #device is detected change label

    #def on_text(self, barcode, clock):

        #self.barcode = Barcode().text

        #Clock.schedule_once(self.run_test, 2)

    def change_label(self):
        if self.prompt.text is 'Plug in device':
            self.prompt.text = 'Device detected'
        elif self.prompt.text == 'Device detected':
            self.prompt.text = 'Scan device'
        elif self.prompt.text == 'Scan device':
            self.prompt.text = 'Plug in device'

    def run_test(self, proc):

        #subprocess call to run app
        looptest = subprocess.call('sudo ./h2hlooptest -v', shell=True)

        #catch exit code then change label to Pass or fail
        if looptest == 0:
            pf = PassFail().text = 'Pass'

        else:
            pafa = PassFail().text = 'Fail'

        self.csv_write(pafa)

    def csv_write(self, pafa):

        with open("results.csv", "a") as csv_file:

            writer = csv.writer(csv_file, delimiter=',')
            csvlist=[[dt, Barcode().text, pafa]]
            writer.writerows(csvlist)

if __name__=="__main__":
    UsbApp().run()
这不会将调度函数绑定到text属性,它只调用一次
schedule\u
函数

您需要将函数传递给bind方法。在这种情况下,可以使用lambda函数:

t.bind(text=lambda instance, value: Clock.schedule_once(self.run_test, 2))

谢谢,但是它仍然使用您的新代码运行它,而没有任何输入字段。我希望它只在字段中输入字符后运行。文本更改时运行。它还可以在小部件首次实例化时运行。如果要确保输入了文本,请在
self.run_test
函数中对此进行检查。我执行了“If Barcode().text not None:”检查,并且在小部件第一次实例化时仍然运行。@Wann我猜
Barcode().text
不会返回您已经存在的
t
实例的文本,除非Kivy TextInputs是单例或其他奇怪的东西。此外,如果没有输入文本,我希望
.text
是空字符串,而不是
None
。您应该尝试将
t
设置为
self
的属性(即,将
t=…
替换为
self.t=…
),如果self.t.text!=“”:谢谢@Kevin,效果更好。它实际上在键入字符时运行。而不是实例化。我现在必须弄清楚如何在运行我的函数之前获得整个序列,而不是每个字符。再次感谢!
t.bind(text=lambda instance, value: Clock.schedule_once(self.run_test, 2))