2017-02-07 11 views
0

Я работаю с двумя файламиPython Kivy: Обратитесь к ярлыку (кнопка) идентификатору (созданный в * .py файла) с помощью команды self.ids

  • test.py
  • test.kv

содержание test.py заключается в следующем:

import kivy 
kivy.require('1.0.0') 

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.button import Button 
from kivy.uix.label import Label 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.lang import Builder 
Builder.load_file("test.kv") 


class MainScreen(Screen): 
    def __init__(self, *args, **kwargs): 
     super(MainScreen, self).__init__(*args, **kwargs) 

    def printIds(self): 
     print self.ids 

    def printChildren(self): 
     print self.ids.box.children 
     for child in self.ids.box.children: 
      print child.text, child.id 

    def addButton(self): 
     self.ids.box.add_widget(Button(text = "newly added Button", id = "test_button_id")) 

    pass 

class MyApp(App): 
    def __init__(self,*args, **kwargs): 
     super(MyApp, self).__init__(*args, **kwargs) 

    def build(self): 
     app = MainScreen() 
     return app 



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

содержание test.kv является:

<MainScreen>: 
    BoxLayout: 
     orientation: "horizontal" 
     id: box 
     Label: 
      text: "test label" 
      id: test_label_id 
     Button: 
      text: "Print Children" 
      on_release: root.printChildren() 
     Button: 
      text: "Print ids" 
      on_release: root.printIds() 
     Button: 
      text: "Add Button" 
      on_release: root.addButton() 

Моя проблема заключается в следующем: Я хочу, чтобы получить доступ к недавно добавленный Button (который будет добавлен при вызове функции AddButton с помощью нажатия на кнопку Add Button) с помощью команды self.ids в файле питона. Но когда я это делаю (т. Е. Нажав кнопки «Идентификация кнопки»), он показывает только идентификаторы, которые я назначил в файле kivy, а именно: box (который является идентификатором BoxLayout) и test_label_id (который является идентификатором тестовой метки).

Я думаю неправильно? Я имею в виду, если я добавлю кнопку в файл python с командой self.ids.box.add_widged(Button(text="...", id="...")), она должна быть видимой с помощью команды self.ids, правильно?

Я также могу проверить это как-то в другом направлении: если я распечатаю все дети boxlayout и возьму их, например. текст и идентификатор с командой child.text или child.id отображает текст и идентификатор недавно добавленной кнопки, а также текст других кнопок/ярлыков, но не идентификаторы, которые я назначил в файле kivy (в частности: отображает None для них).

Я делаю что-то ужасно неправильно?

ответ

0

ID создается только в кВ Ланг и такое действие (Button(id='something')) не может использоваться в том, как общий:

Button: 
    id: my_id 

будет. Он не хранит идентификаторы в словаре родителя ids. Тем не менее, вы можете изменить словарь родителя ids с помощью некоторого аккуратного трюка (это только «наблюдаемый» словарь), но в конце вам нужно будет сделать ссылку на ваш виджет слабым/прокси-сервером, иначе виджет не собирался собирать мусор.

Лучшей идеей является создание какого-либо контейнера для ваших виджетов в kv и просто использование его свойства children с индексом или создание настраиваемого свойства вместе с циклом по его родительским дочерним элементам и проверка значения настраиваемого свойства, или что-то вроде этого:

# in App class 
class X(App): 
    my_widgets = DictProperty() 

# in custom widget init 
def __init__(self, **kwargs): 
    super(<class name>, self).__init__(**kwargs) 
    app = App.get_running_app() 
    app.my_widgets['my_new_widget'] = WeakProxy(Button()) 

Ref WeakProxy. :)

+0

спасибо за ваш быстрый ответ! Я попытался адаптировать свой код, чтобы включить словарь, как вам было предложено, но при выполнении: ТипError: объект 'kivy.properties.DictProperty' не поддерживает назначение элемента – klexx

+0

@klexx oh, riiight, переместите 'DictProperty' до уровня класса (удалите' self.' и под 'class MyApp ...'), тогда он должен работать. Плохая ошибка, извините ^^ Проверьте изменение. – KeyWeeUsr

+0

ОК он компилируется сейчас.Еще раз спасибо :) Я пытаюсь выяснить, смогу ли я решить свою проблему с этим. Я, вероятно, вернусь к этому ... :) – klexx

 Смежные вопросы

  • Нет связанных вопросов^_^