__init__ не вызывается при Cythoning Kivy App - PullRequest
0 голосов
/ 27 апреля 2019

Итак, я запустил приложение Kivy и получил странное поведение.Любой класс, определенный в чистом KV, работает, любой класс, определенный в чистом Python, работает.Однако любой класс, использующий гибрид этих двух типов, не будет вызывать метод python init .Как видно из приведенного ниже примера, init MyButton не был вызван.

Работая на MacOS, я скомпилировал команду «kivy compile.py build_ext --inplace» и запустил main.py с «kivy main»..py ".

test.py

import kivy

kivy.require('1.10.0')

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder

Builder.load_string('''

<MyButton@Button>:
    size_hint: 0.3, 0.3
    text: 'Has init been called?'

<AParent@FloatLayout>:
    MyButton
''')

class MyButton(Button):
    def __init__(self, **kwargs):
        print('Init called in MyButton!')
        super(MyButton, self).__init__(**kwargs)

class AParent(FloatLayout):
    def __init__(self, **kwargs):
        print('Init called in AParent!')
        super(AParent, self).__init__(**kwargs)

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

compile.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [
    Extension('test.py',  ['test.py']),
]
setup(
    name = 'test',
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules
)

main.py


from test import TestApp

TestApp().run()

Я что-то пропустилили это лучший результат, чтобы написать это на чистом питоне.Заранее спасибо.

1 Ответ

0 голосов
/ 27 апреля 2019
<AParent@FloatLayout>:

Это синтаксис для объявления динамического класса kv, который не ожидает соответствующего класса python.Вместо этого используйте <AParent>.

Мне не ясно, важен ли ваш материал на Cython.С кодом как есть, используется ли когда-либо вообще скомпилированная версия?

...