2013-06-24 3 views
0

У меня возникли проблемы с назначением имен псевдонимов при импорте классов на языке Киви. Документация Я Ниже here:Как использовать псевдоним в импорте Kivy Language?

Чтобы импортировать что-то из питона:

#:import name x.y.z 

эквивалентно:

from x.y import z as name 

Я создал сокращенную версию моей проблемы. pieces.py находится внутри частей упаковки (с соответствующими __init__.py), а pieces.kv находится в моей рабочей папке.

частей/pieces.py

from kivy.uix.button import Button 
from kivy.uix.gridlayout import GridLayout 

class PieceA(Button): 
    pass 
class PieceB(Button): 
    pass 
class PieceC(GridLayout): 
    pass 

pieces.kv

#:import Boo pieces.pieces.PieceA 
#:import Foo pieces.pieces.PieceB 
#:import Too pieces.pieces.PieceC 
<Boo>: 
    text: "A" 
<Foo>: 
    text: "B" 
<Too>: 
    rows: 2 
    Boo: 
    Foo: 

импорт является, как указано в документации, но псевдонимы Boo, Foo и тоже не существо распознан. Есть также много других версий этого, что неожиданно работает , если я использую оригинальное имя класса, но не имя псевдонима:

#:import Boo pieces.pieces 
<PieceA>: 
    text: "A" 
<PieceB>: 
    text: "B" 
<PieceC>: 
    rows: 2 
    PieceA: 
    PieceB: 

Даже если я заменяю #:import Boo pieces.pieces для #:import Boo pieces.pieces.PieceA. Он продолжает работать до тех пор, пока я использую исходное имя классов, но я не могу использовать псевдонимы. Как использовать псевдоним при импорте класса на языке Kivy?


Я также добавил здесь мои другие 2 файла в случае, если вы хотите проверить.

main.py

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.gridlayout import GridLayout 

Builder.load_file('pieces.kv') 

class Gallery(GridLayout): 
    pass 

class GalleryApp(App): 
    def build(self): 
     return Gallery() 

GalleryApp().run() 

gallery.kv

<Gallery>: 
    cols: 3 
    PieceA: 
    PieceB: 
    PieceC: 
+0

Возможно, важно указать, что я использую Kivy v1.7.0 ,, на всякий случай, это ошибка. –

ответ

1

Я не уверен, что вы хотите сделать, это действительно возможно, но по крайней мере этот импорт синтаксис не имеет этой цели и ведет себя правильно. То есть, синтаксис #:import относится только к питону частям файла кв, так, например, вы могли бы включать в себя код, как

#:import Boo pieces.pieces.PieceA 
... 
... 
<SomeWidget>: 
    Button: 
     on_press: some_other_widget.add_widget(Boo()) 

Это будет делать то, что вы ожидаете, с Boo является стандартным питон псевдонимом PieceA.

Однако, когда файл kv разобран, я не знаю способа псевдонимов имен правил класса. Я также не уверен, зачем вам нужно или нужно (не это означает, что нет причины!), Почему бы просто не называть их PieceA, PieceB и т. Д.?

+0

это часть других файлов, и у меня возник конфликт имен классов. Мне потребовалось некоторое время, чтобы узнать, что происходит, поэтому я прекратил менять имя одного из классов, так как импорт не работал.Я вижу, что имя псевдонима работает только на стороне python, но я не согласен с тем, что синтаксисы '#: import' применяются только к стороне Python. Если я не поставлю импорт, это будет работать неправильно. –

+0

Re: последнее предложение, которое кажется странным, я не использую импорт, и правила применяются отлично - я думаю, что импорт не должен быть необходимым для определения правил, только для использования в коде python. – inclement

+0

https://github.com/inclement/fourierdroid - это проект, с которым я играл, и работает нормально, но не использует #: import в файле kv – inclement