首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中不能访问kv根变量

在python中不能访问kv根变量
EN

Stack Overflow用户
提问于 2018-06-02 04:05:35
回答 1查看 205关注 0票数 0

这是我的kv文件,我在其中创建了一个自定义小部件,以及kv本身中的两个根变量name和date。

代码语言:javascript
复制
<Entry@Widget>:
    name: ''
    date: ''
    size_hint: (None, None)
    canvas.before:
        Color:
            rgba: 1, 1, 1, .4
        Rectangle:
            pos: self.pos
            size: self.size
        Color:
            rgba: 0, 0, 0, 1
    Label:
        text: root.name[0:1]
        color: 41/255, 128/255, 185/255, 1
        pos: root.pos
        font_size: sp(50)
    Label:
        text: root.name[1:]
        color: 41/255, 128/255, 185/255, 1
        pos: root.x+sp(80), root.y+sp(8)
        font_size: sp(30)
    Label:
        text: root.date
        color: 17/255, 80/255, 122/255, 1
        pos: root.x+sp(50), root.y-sp(10)
        font_size: 10

还有一件事。我在python代码中替换了如下所示的Entry小部件的on_touch_down事件:

代码语言:javascript
复制
class Entry(RelativeLayout):

    def on_touch_down(self, touch):
        super(Entry, self).on_touch_down(touch)
        popup = Mypopup()
        popup.open()
        return True

现在在我的主屏幕中,我正在动态添加小部件,所以我让我用python输入代码,如下所示:

代码语言:javascript
复制
class MainScreen(FloatLayout):

    def __init__(self, **kargs):
        super(MainScreen, self).__init__(**kargs)
        layout = GridLayout(cols=1, spacing=10, size_hint_y=None)
        layout.bind(minimum_height=layout.setter('height'))
        for i in range(100):
            entry = Entry(name='Facebook', date='30/21/2', size=(Window.width, sp(100)))
            layout.add_widget(entry)    
        scroll = ScrollView(size_hint=(1, None), height=Window.height)
        scroll.add_widget(layout)
        self.add_widget(scroll)

但它给了我一个错误,说:

代码语言:javascript
复制
File "C:\Users\Himanshu Pharawal\AppData\Local\Programs\Python\Python36\lib\site-packages\kivy\app.py", line 802, in run
     root = self.build()    File "main.py", line 47, in build
     return MainScreen()    File "main.py", line 38, in __init__
     entry = Entry(name='Facebook', date='30/21/2', size=(Window.width, sp(100)))    File "main.py", line 21, in __init__
     super(Entry, self).__init__(*args, **kargs)    File "C:\Users\Himanshu Pharawal\AppData\Local\Programs\Python\Python36\lib\site-packages\kivy\uix\relativelayout.py", line 265, in __init__
     super(RelativeLayout, self).__init__(**kw)    File "C:\Users\Himanshu Pharawal\AppData\Local\Programs\Python\Python36\lib\site-packages\kivy\uix\floatlayout.py", line 65, in __init__
     super(FloatLayout, self).__init__(**kwargs)    File "C:\Users\Himanshu Pharawal\AppData\Local\Programs\Python\Python36\lib\site-packages\kivy\uix\layout.py", line 76, in __init__
     super(Layout, self).__init__(**kwargs)    File "C:\Users\Himanshu Pharawal\AppData\Local\Programs\Python\Python36\lib\site-packages\kivy\uix\widget.py", line 337, in __init__
     super(Widget, self).__init__(**kwargs)    File "kivy\_event.pyx", line 254, in kivy._event.EventDispatcher.__init__ (kivy\_event.c:5332) TypeError: object.__init__() takes no parameters
EN

回答 1

Stack Overflow用户

发布于 2018-06-02 05:31:42

您不能指明您在.py中有一个名为Entry的继承自FloatLayout的类,而在.kv中有另一个继承自WidgetEntry,首先它不会排除在.kv中创建的条目,您必须做的只是指出您将继续通过<Entry>实现该类,而不在.kv中执行任何其他内容。

另一方面,name和date属性不会自动识别,您必须将它们分开,如下所示:

main.py

代码语言:javascript
复制
from kivy.app import App

from kivy.core.window import Window

from kivy.metrics import sp

from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.popup import Popup

class Mypopup(Popup):
    pass

class Entry(FloatLayout):
    def __init__(self, name="", date="", **kwargs):
        super(Entry, self).__init__(**kwargs)
        self.name = name
        self.date = date

    def on_touch_down(self, touch):
        super(Entry, self).on_touch_down(touch)
        popup = Mypopup()
        popup.open()
        return True

class MainScreen(FloatLayout):
    def __init__(self, **kargs):
        super(MainScreen, self).__init__(**kargs)
        layout = GridLayout(cols=1, spacing=10, size_hint_y=None)
        layout.bind(minimum_height=layout.setter('height'))
        for i in range(100):
            entry = Entry(name='Facebook', date='30/21/2', size=(Window.width, sp(100)))
            layout.add_widget(entry)    
        scroll = ScrollView(size_hint=(1, None), height=Window.height)
        scroll.add_widget(layout)
        self.add_widget(scroll)

class TestApp(App):
    def build(self):
        return MainScreen()

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

test.kv:

代码语言:javascript
复制
<Entry>:
    name: ''
    date: ''
    size_hint: (None, None)
    canvas.before:
        Color:
            rgba: 1, 1, 1, .4
        Rectangle:
            pos: self.pos
            size: self.size
        Color:
            rgba: 0, 0, 0, 1
    Label:
        text: root.name[0:1]
        color: 41/255, 128/255, 185/255, 1
        pos: root.pos
        font_size: sp(50)
    Label:
        text: root.name[1:]
        color: 41/255, 128/255, 185/255, 1
        pos: root.x+sp(80), root.y+sp(8)
        font_size: sp(30)
    Label:
        text: root.date
        color: 17/255, 80/255, 122/255, 1
        pos: root.x+sp(50), root.y-sp(10)
        font_size: 10
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50650354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档