如何从.py文件访问Kivy TextInput'文本'属性 [英] How to access Kivy TextInput 'text' attribute from .py file

查看:533
本文介绍了如何从.py文件访问Kivy TextInput'文本'属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在我的.py文件中创建了TextInput小部件,并且尝试访问TextInput的值,以便可以将其用于Sqlite3查询.由于某种原因,我一直收到错误消息,提示"AttributeError:'NoneType'对象没有属性'text'".

I have created a TextInput widget in my .py file and i am trying to access the value of the TextInput so i can use it for an Sqlite3 query. For some reason i keep getting an error saying "AttributeError: 'NoneType' object has no attribute 'text'".

如果我在.kv文件中创建窗口小部件并将ID用作ObjectProperty(),则能够访问TextInput_text值.我不确定是否必须在.py文件中执行类似的操作.

I am able to access TextInput_text values if i create the widget in the .kv file and use the id as an ObjectProperty(). I am unsure if i have to do something like that inside the .py file.

这是我正在尝试的代码:

Here is the code i am trying:

def choose_date_water(self):
    box = FloatLayout()
    box.add_widget(Label(text = "Select Date To View", font_size = (30), pos_hint = {'center_x':0.5, 'center_y': 0.9 }))


    self.dp1 = box.add_widget(TextInput(pHint_x = (0.35), pHint_y = (0.55), size_hint = (None, None), size = (190, 50), font_size = (33), pos_hint = {'center_x':0.5, 'center_y': 0.6 }))

    btn1 = Button(text = "OK", size_hint = (None, None), size = (200, 50), pos_hint = {'center_x':0.5, 'center_y': 0.25 })

    box.add_widget(btn1)

    popup1 = Popup(title = "Choose Date", title_size = (40), title_align = 'center', content = box, size_hint = (None, None), size = (600, 300))

    btn1.bind(on_press = self.view_water_figures, on_release = popup1.dismiss)

    popup1.open()
    return self.dp1





def view_water_figures(self, instance):
    conn = sqlite3.connect('logsheet.db')
    c = conn.cursor()

    c.execute("SELECT today_total_dw_vol, today_total_fw_vol, total_evap_out FROM waterfigures WHERE date = ?", (self.dp1.text,))

    wf = c.fetchall()

    print wf

任何帮助都会很棒.

谢谢.

推荐答案

AttributeError-说明

     c.execute("SELECT today_total_dw_vol, today_total_fw_vol, total_evap_out FROM waterfigures WHERE date = ?", (self.dp1.text,))
 AttributeError: 'NoneType' object has no attribute 'text'

self.dp1是一个ObjectProperty. print(type(self.dp1))将显示它是<class 'NoneType'>的类型.它没有连接到TextInput小部件.解决方法如下:

self.dp1 is an ObjectProperty. A print(type(self.dp1)) will show that it is a type of <class 'NoneType'>. It is not hook up to TextInput widget. The solution is as follow:

def choose_date_water(self):
    ...
    self.dp1 = TextInput(pHint_x = (0.35), pHint_y = (0.55), size_hint = (None, None), size = (190, 50), font_size = (33), pos_hint = {'center_x':0.5, 'center_y': 0.6 })

    box.add_widget(self.dp1)

解决方案-使用Python和Kv文件

  1. 在kv文件中,为TextInput小部件提供一个ID,例如id: sel_date
  2. 在Python代码中,使用self.ids look对象访问kv文件中定义的TextInput文本.

  1. In kv file, give an id to the TextInput widget e.g. id: sel_date
  2. In Python code, use self.ids look object to access the TextInput's text defined in kv file.

self.ids.sel_date.text

self.ids.sel_date.text

在您的python代码中访问在Kv lang内部定义的小部件

当解析您的kv文件时,kivy会收集所有标有的小部件 id,并将其放在此self.ids字典类型属性

When your kv file is parsed, kivy collects all the widgets tagged with id’s and places them in this self.ids dictionary type property

有关详细信息,请参见以下示例.

Please refer to the example below for details.

import sqlite3

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.config import Config


class SQLite3KivyDemo(BoxLayout):

    def db_query(self):
        connection = sqlite3.connect("company.db")

        cursor = connection.cursor()

        sql_command = """SELECT * FROM employee WHERE birth_date = "{}";""".format(self.ids.sel_date.text)
        cursor.execute(sql_command)

        result = cursor.fetchall()

        for row in result:
            print(row)


class TestApp(App):

    def build(self):
        Config.set("graphics", "width", "800")
        Config.set("graphics", "height", "50")
        Config.set("graphics", "borderless", "0")
        Config.set("graphics", "resizable", "0")
        self.title = "Kivy & SQLite3 Demo"
        return SQLite3KivyDemo()


if __name__ == "__main__":
    TestApp().run()

test.kv

#:kivy 1.10.0

<SQLite3KivyDemo>:
    canvas.before:
        Color:
            rgb: 1, 0.5, 0  # Orange
            # rgb: 0, 0.5, 1  # Sky blue
        Rectangle:
            pos: self.pos
            size: self.size
    orientation: "vertical"
    BoxLayout:
        size_hint_y: 0.1
        Label:
            text: "Enter Date of Birth"
        TextInput:
            id: sel_date
            multiline: False
            size_hint_x: 3
        Button:
            text: "Display Data"
            on_release: root.db_query()

输出

这篇关于如何从.py文件访问Kivy TextInput'文本'属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆