2016-10-16 3 views
2

Способ создания всплывающих окон в киви, всплывающее окно, похоже, привязано к окну, а не родительский объект, создавший всплывающее окно. Popup поставляется с self.dismiss(), чтобы закрыть всплывающее окно, но я не могу найти способ доступа к «родительскому» объекту, поскольку, несмотря на создание всплывающего окна, он, кажется, существует вне его.Доступ к родительскому окну kivy

Пример сниппеты:

class StartButton(ActionButton) 
    def on_release(self): 
     self.popup = StartPop(id='popid') 
     self.popup.open() 

class StartPop(Popup): 
    def close(self): 
     self.dismiss() 
    def start(self): 
     print(self) 
     print(self.parent) 

Результат команды печати является

<__main__.StartPop object at 0x00000000037BBCE0> 

<kivy.core.window.window_sdl2.WindowSDL object at 0x000000000373B0B0> 

Так, а не родитель будучи StartButton, родитель которого я хотел бы также ожидать, чтобы получить доступ и т.д. родитель является Окно.

Я не вижу, как я мог бы связывать любую функцию, которая таким образом взаимодействует с виджетами, которые я использовал для создания всплывающего окна. Мне нужно, чтобы родительский объект и его родители делали что-то на основе того, что я нажимаю на всплывающее окно, но я не могу понять, как это можно реализовать.

В .kv файле

<StartPop>: 
    title: 'Popup' 
    auto_dismiss: True 
    size_hint: None,None 
    size: 400,250 
    BoxLayout: 
     orientation: 'vertical' 
     Label: 
      text: 'sample text here' 
      text_size: self.size 
      halign: 'center' 
      valign: 'middle' 
     BoxLayout: 
      orientation: 'horizontal' 
      Button: 
       size_hint: 1,0.5 
       text: 'Cancel' 
       on_release: root.close() 
      Button: 
       size_hint: 1,0.5 
       text: 'Start Testing' 
       on_release: root.start() 

ответ

2

Это реализовано так потому, что она должна быть скрыта большую часть времени, но по-прежнему активен, так что open() можно назвать. Киви, похоже, не справляется со скрытием виджетов другим способом, который на самом деле удаляет и держит ссылку где-то (нет свойства hide), возможно, даже из-за этого. Или потому, что было проще реализовать его таким образом. Тем не менее, это неплохая реализация, и как работает OO-программирование, вы также можете сделать некоторые причудливые вещи. Вещь, которую вы хотите, может быть обработана просто с kwargs в __init__:

Наследовать от всплывающего окна и получить аргумент пользовательских ключевых слов:

class StartPop(Popup): 
    def __init__(self, **kwargs): 
     self.caller = kwargs.get('caller') 
     super(StartPop, self).__init__(**kwargs) 
     print self.caller 

Затем создать экземпляр этого обычая Popup и установить родитель:

pop = StartPop(caller=self) 
pop.open() 

Ключевое слово caller не ограничивается только виджетами Kivy. Поместите туда какой-нибудь объект, с которым вы хотите заняться, и затем вы можете получить доступ к нему внутри объекта StartPop через self.caller

+0

Это имеет большой смысл. Я реализовал с kwargs через __init__, как было предложено, и это отлично работает, спасибо! – Daniel

+1

@ Даниэль отмечает, что иногда 'kwargs.pop()' должно быть более полезным или безопасным, главным образом, если вы используете имена переменных, которые могли быть использованы в классе, который вы наследуете. Однако 'pop' возвращает' KeyError', когда такого ключа нет ('kwargs' - это просто словарь), поэтому ... зависит от вкуса/использования, которое я бы сказал. – KeyWeeUsr

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