Действие после закрытия диалогового окна в python kivy
Всем привет. Есть приложение - по нажатию на кнопку появляется диалоговое окно. При нажатии на кнопку Dоne в диалоговом окне оно должно закрываться и на стартовом лэйауте должна появляться кнопка (это методы close_dialog и new_window). Сейчас при нажатии окно действительно закрывается при помощи метода dismiss(), но вот кнопка не появляется. Подскажите, пожалуйста, почему так и как это исправить?
Предполагаю, что дело в том, что программа пытается создать кнопку в закрывающемся диалоговом окне, так ли это?
Код .ру:
from kivy.lang import Builder
from kivy.core.window import Window
from kivymd.app import MDApp
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivymd.uix.label import MDLabel
from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.scrollview import ScrollView
from kivymd.uix.button import MDFlatButton
from kivymd.uix.dialog import MDDialog
from kivymd.uix.textfield import MDTextField
Window.size = (240, 426)
class ContentNavigationDrawer(BoxLayout):
pass
class Content(BoxLayout):
pass
class Container(BoxLayout):
dialog = None
button_amount = 1
def show_dialog(self):
if not self.dialog:
self.dialog = MDDialog(
title="Create new group",
type="custom",
content_cls=Content(),
)
self.dialog.open()
def close_dialog(self, *args):
self.dialog.dismiss()
self.new_window()
def new_window(self, *args):
self.add_widget(
MDFlatButton(text="New group", size_hint_y=None, height=100))
class testApp(MDApp, Container):
def build(self):
return Container()
if __name__ == '__main__':
testApp().run()
Код .kv:
<Content>
orientation: "vertical"
spacing: "12dp"
size_hint_y: None
height: "120dp"
MDCheckbox:
hint_text: "Online"
size_hint: (None, None)
active: True
pos_hint: {'center_x': .5, 'center_y': .4}
MDTextField:
hint_text: "Group name"
MDFlatButton:
id: btn1
text: "Done"
text_color: self.theme_cls.primary_color
on_release: app.close_dialog()
<Container>
orientation: "vertical"
Screen:
MDFloatingActionButton:
pos_hint: {'right': 0.95, 'y': 0.05}
theme_text_color: "Custom"
text_color: app.theme_cls.primary_color
on_release:
app.show_dialog()
NavigationLayout:
ScreenManager:
Screen:
BoxLayout:
orientation: 'vertical'
MDToolbar:
size_hint: 1, 0.15
title: "Navigation Drawer"
elevation: 10
left_action_items: [['menu', lambda x: nav_drawer.toggle_nav_drawer()]]
Widget:
MDNavigationDrawer:
id: nav_drawer
ContentNavigationDrawer:
Ответы (1 шт):
программа пытается создать кнопку в закрывающемся диалоговом окне, так ли это?
В общем, да. Это потому что self - экземпляр класса. У тебя в функции добавления кнопки написано "self.add_widget()", т.е. добавить кнопку к текущему диалоговому окну. А тебе надо на начальный активити. Можно попробовать,например, в kv-файле присвоить нужному объекту, где должна находиться кнопка, id, и добавлять кнопку не в self а в виджет по этому id. Например, заменив self внутри функции new_window() на MDApp.get_running_app().root.ids["screen"], где screen - id для нужного объекта
Пример: KV (просто добавил id)
NavigationLayout:
ScreenManager:
Screen:
BoxLayout:
orientation: 'vertical'
id: screen
MDToolbar:
size_hint: 1, 0.15
title: "Navigation Drawer"
elevation: 10
left_action_items: [['menu', lambda x: nav_drawer.toggle_nav_drawer()]]
Widget:
py (замена self)
def new_window(self, *args):
MDApp.get_running_app().root.ids["screen"].add_widget(
MDFlatButton(text="New group", size_hint_y=None, height=100))
Не знаю, насколько такой совет хорош, будьте осторожны. Вывод ids из этой команды говорит
'screen': <WeakProxy to <kivy.uix.boxlayout.BoxLayout object at 0x09CB3490>>
Так что, если знаете более надежный способ - вперед. Но этот пока работает.