【问题标题】:how can close ModalView after change screen in Python Kivy在 Python Kivy 中更改屏幕后如何关闭 ModalView
【发布时间】:2019-02-19 09:52:41
【问题描述】:

我有 ModelView 类和屏幕类,当打开模式视图并在更改为第二个屏幕类后在第一个屏幕类上做一些事情但模式关闭不起作用时

/导入模块/

from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import StringProperty, partial
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.modalview import ModalView
from kivy.uix.screenmanager import Screen
from kivy.uix.screenmanager import ScreenManager
from kivy.uix.scrollview import ScrollView
from kivy.uix.stacklayout import StackLayout

/*我的滚动视图,用于将按钮放到屏幕1 */

class SView(ScrollView):

    def __init__(self, **kwargs):
        super(SView, self).__init__(**kwargs)
        Clock.schedule_interval(self.update, 1)
        self.MM = MyModal()
        self.MM.MyButton=self.MyButton

    def MyButton(self, *args):
        print("Hello")

    def MMDismiss(self, *args):
        pass

    def ModalOpen(self, instance, button, *args):
        self.MM.open()
        self.MM.MyButton = self.MyButton
        self.MMDismiss = self.MM.dismiss


    def update(self, *args):

        layout = GridLayout(width=480, padding=10, cols=7, spacing=10, size_hint_y=None)

        layout.bind(minimum_height=layout.setter('height'))

        self.buttons=["One", "Two", "Three","One", "Two", "Three","One", "Two", "Three","One", "Two", "Three","One", "Two", "Three","One", "Two", "Three","One", "Two", "Three","One", "Two", "Three","One", "Two", "Three","One", "Two", "Three"]


        for key in self.buttons:

            stacklayout = StackLayout(size_hint_y=None, size_hint_x=None, height=130, width=100, orientation='lr-tb')

            btn = Button(text=key, size_hint_y=None, size_hint_x=None, height=130, width=100)

            stacklayout.add_widget(btn)
            btn.bind(on_release=partial(self.ModalOpen, key))

            layout.add_widget(stacklayout)
        self.clear_widgets()
        self.add_widget(layout)

/*当按下screen1的按钮时打开模态*/

class MyModal(ModalView):

    text = StringProperty("text")

    def __init__(self, **kwargs):
        super(MyModal, self).__init__(**kwargs)
        self.size_hint = (None, None)
        self.size = (200, 200)
        self.layout=GridLayout(cols=1,padding=10,spacing=10)
        self.layout.add_widget(Label(text=self.text))
        self.btn=Button(text="My Button")
        self.bind(on_press=self.MyButton)
        self.layout.add_widget(self.btn)
        self.add_widget(self.layout)

    def MyButton(self, *args):
       pass

/我的屏幕1/

class Screen1(Screen):
    def __init__(self, **kwargs):
        super(Screen1, self).__init__(**kwargs)
        self.sview=SView()
        self.mylayout = GridLayout(cols=1)
        self.mylayout.add_widget(self.sview)
        self.add_widget(self.mylayout)
        self.sview.MyButton = self.MyButton

    def MyButton(self, instance, button):
        self.manager.current = "screen2"
        print("screen 2")


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

/我的构建器字符串/

Builder.load_string('''
<SM>:
    Screen1:
        name: "screen1"
    Screen2:
        name: "screen2"

''')

/我的屏幕管理器/

class SM(ScreenManager):
    def __init__(self, **kwargs):
        super(SM, self).__init__(**kwargs)
        self.current = 'screen1'

/我的应用/

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


    def build(self):
        self.title = "MAVA"
        self.icon = "./images/logo/logo.png"
        return SM()

if __name__ == "__main__":
    Main().run()

【问题讨论】:

  • 您能否编辑您的问题以包含不起作用的代码。尝试显示尽可能少的代码,同时仍然突出显示问题。如果我们能够复制/粘贴您的代码示例并自己查看错误,那就更好了
  • 我会添加我的代码谢谢

标签: kivy


【解决方案1】:

在您的MyModal 类中,您可以将dismiss 添加到Button 为:

class MyModal(ModalView):

    text = StringProperty("text")

    def __init__(self, **kwargs):
        super(MyModal, self).__init__(**kwargs)
        self.size_hint = (None, None)
        self.size = (200, 200)
        self.layout=GridLayout(cols=1,padding=10,spacing=10)
        self.layout.add_widget(Label(text=self.text))
        self.btn=Button(text="My Button", on_press=self.dismiss)  # add dismiss action
        self.layout.add_widget(self.btn)
        self.add_widget(self.layout)

我还删除了以下行:self.bind(on_press=self.MyButton)。我不认为这有什么作用。

【讨论】:

  • 是的,你是对的,但实际上这个按钮改变屏幕但在我的代码中不起作用:) 我的问题,改变屏幕后自动关闭模式。
猜你喜欢
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2020-05-05
相关资源
最近更新 更多