更改Kivy中的弹出文本

时间:2018-05-21 02:56:13

标签: python popup kivy

我是Kivy的新手,所以这可能是一个微不足道的问题。我正在开发一个有两个屏幕的项目,每个屏幕都包含一个生成弹出窗口的按钮。我希望弹出窗口显示包含当前屏幕名称的语句。我的问题是尽管有一个方法来更改弹出文本,但始终显示占位符文本。为什么changeText方法不会更改弹出窗口的文本?

我的问题似乎与显示的问题类似:

但是我在理解如何将其应用于我的具体情况时遇到了一些麻烦。

Python代码:

class Screen1(Screen):  
    pass

class Screen2(Screen):
    pass 

class MyManager(ScreenManager):
    pass

class PopUp(Popup):
    def changeText(self,nameStr):
        self.ids.label.text = "You are on Screen %s!" %nameStr #this is text that I want to display 

class PrimaryApp(App):
    def build(self):
        return MyManager()

PrimaryApp().run()

Kv代码:

#:import Factory kivy.factory.Factory
<MyManager>:
    Screen1:
        id: screen1
    Screen2: 
        id: screen2

<Screen1>:
    name: "one"
    GridLayout:
        id: grid
        rows: 2
        Button:
            id: button1
            text: "Go to Screen Two"
            on_release: root.manager.current = "two" 
        Button: 
            id: button2
            text: "Display Popup" 
            on_release: 
                Factory.PopUp().changeText(root.name)
                Factory.PopUp().open()
<Screen2>: 
    name: "two" 
    GridLayout:
        id: grid
        rows: 2 
        Button:
            id: button1
            text: "Go to Screen One" 
            on_release: root.manager.current = "one" 
        Button: 
            id: button2
            text: "Display Popup"
            on_release:
                Factory.PopUp().changeText(root.name)
                Factory.PopUp().open()


<PopUp>:
    id:pop
    size_hint: (.5,.5)
    title: "Notice!" 
    Label: 
        id: label
        text: "PLACEHOLDER TEXT" #this is not the code I want displayed

[1]:

2 个答案:

答案 0 :(得分:0)

每当您致电Factory().Popup()时,它都会创建一个与之前无关的全新Popup。你能做什么&#39>:

在kv中:

...
<Screen1>:
    name: "one"
    GridLayout:
        id: grid
        rows: 2
        Button:
            id: button1
            text: "Go to Screen Two"
            on_release: root.manager.current = "two"
        Button:
            id: button2
            text: "Display Popup"
            on_release:
                p = Factory.PopUp()
                p.changeText(root.name)
                p.open()

对于第二个屏幕也是如此。但每当你释放这些按钮时,它就会创建一个新创建的弹出窗口,浪费了太多的内存。您可以做的最好的事情是使用弹出窗口初始化您的屏幕管理器,然后只更改此弹出窗口的文本:

的Python:

...
from kivy.properties import ObjectProperty

...
class PopUp(Popup):
    def changeText(self,*args):
        self.ids.label.text = "You are on Screen %s!" % args[0].current

class MyManager(ScreenManager):
    popup = ObjectProperty()

    def __init__(self, **kwargs):
        super(MyManager, self).__init__(**kwargs)
        self.popup = PopUp()
        self.bind(current=self.popup.changeText)

和kv:

...
<PopUp>:
    id:pop
    size_hint: (.5,.5)
    title: "Notice!"
    Label:
        id: label
        text: "You are on Screen one!"

<Screen1>:
    name: "one"
    GridLayout:
        id: grid
        rows: 2
        Button:
            id: button1
            text: "Go to Screen Two"
            on_release: root.manager.current = "two"
        Button:
            id: button2
            text: "Display Popup"
            on_release:
                root.manager.popup.open() #Same thing for the second screen

答案 1 :(得分:0)

使用弹出事件 on_open 更改弹出内容,标签小部件的文本。

Popup » API

  

活动:on_open:
  被解雇   当弹出窗口打开时。

片段

<PopUp>:
    on_open:
        label.text = "You are on Screen %s!" % app.root.current
    id:pop
    ...

实施例

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup


class Screen1(Screen):
    pass


class Screen2(Screen):
    pass


class MyManager(ScreenManager):
    pass


class PopUp(Popup):
    pass


class PrimaryApp(App):
    def build(self):
        return MyManager()


PrimaryApp().run()

primary.kv

#:kivy 1.10.0
#:import Factory kivy.factory.Factory

<MyManager>:
    Screen1:
        id: screen1
    Screen2:
        id: screen2

<Screen1>:
    name: "one"
    GridLayout:
        id: grid
        rows: 2
        Button:
            id: button1
            text: "Go to Screen Two"
            on_release: root.manager.current = "two"
        Button:
            id: button2
            text: "Display Popup"
            on_release:
                Factory.PopUp().open()
<Screen2>:
    name: "two"
    GridLayout:
        id: grid
        rows: 2
        Button:
            id: button1
            text: "Go to Screen One"
            on_release: root.manager.current = "one"
        Button:
            id: button2
            text: "Display Popup"
            on_release:
                Factory.PopUp().open()


<PopUp>:
    on_open:
        label.text = "You are on Screen %s!" % app.root.current
    id:pop
    size_hint: (.5,.5)
    title: "Notice!"
    Label:
        id: label
        text: "PLACEHOLDER TEXT" #this is not the code I want displayed

输出

Img01 - Popup at Screen 1 Img02 - Popup at Screen 2