Python Kivy:更改屏幕上的图像源

Python Kivy:更改屏幕上的图像源,python,python-3.x,kivy,Python,Python 3.x,Kivy,在做了很多头晕之后,我创建了一个应用程序,可以打开FileChooser并选择一个图像。然后,一个函数将变换图像并在屏幕上进行更改 只是一个开始,相对来说并不重要。 是文件选择器。路径可能需要编辑ThirdScreen>应显示图像以及最终将引导到其他地方的按钮 我怀疑问题在于线路 sm.current = "_third_screen_" 正在创建一个新实例,它与我传递的所有其他项目都是分开的。如何显示我选择的图像 from kivy.lang import Builder from kivy

在做了很多头晕之后,我创建了一个应用程序,可以打开FileChooser并选择一个图像。然后,一个函数将变换图像并在屏幕上进行更改

只是一个开始,相对来说并不重要。 是文件选择器。路径可能需要编辑ThirdScreen>应显示图像以及最终将引导到其他地方的按钮

我怀疑问题在于线路

sm.current = "_third_screen_"
正在创建一个新实例,它与我传递的所有其他项目都是分开的。如何显示我选择的图像

from kivy.lang import Builder
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, StringProperty


Builder.load_string("""

<MyScreenManager>:
    FirstScreen:
    SecondScreen:
    ThirdScreen:

<FirstScreen>:
    name: '_first_screen_'
    BoxLayout:
        orientation: "horizontal"
        Label:
            id: first_screen_label
            text: "Hi, I'm the home page"
        BoxLayout:
            orientation: "vertical"
            Button:
                text: "Okay!"
                on_press: root.manager.current = '_second_screen_'
            Button:
                text: "Cancel!"
                on_press: app.stop()

<SecondScreen>:
    name: '_second_screen_'
    id: file_chooser
    BoxLayout:
        id: file_chooser_box_layout
        orientation: "horizontal"
        Button
            text: "Open"
            on_press: 
                root.callback_image_and_other_stuff(file_chooser_list_view.selection)
        FileChooserListView:
            id: file_chooser_list_view

<ThirdScreen>:
    name: '_third_screen_'
    BoxLayout:
        orientation: "vertical"
        id: third_screen
        Label:
            id: main_title
            text: "Upload"
            size_hint: (1, 0.1)
        Image:
            id: main_image
            source: root.img
            size_hint: (1, 0.75)
        BoxLayout:
            orientation: "horizontal"
            padding: 10
            size_hint: (1, 0.15)
            Button:
                text: "Okay"
                size_hint: (0.5, 1)
                on_press: image_viewer.image_accepted_by_user(filechooser.selection)
            Button:
                text: "Cancel"
                size_hint: (0.5, 1) 
                on_press: root.manager.current = '_first_screen_'   
""")

class FirstScreen(Screen):
    pass

class SecondScreen(Screen):
    def callback_image_and_other_stuff(self, new_image_address):
        # do other stuff here also, then pass new_image_address along
        new_image_address = new_image_address[0].replace("\\", "/")
        third_screen = ThirdScreen()
        third_screen.callback_image(new_image_address)

class ThirdScreen(Screen):
    img = ObjectProperty(None)

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

    def callback_image(self, new_image_address):
        sm.current = "_third_screen_"
        self.img = new_image_address
        self.ids.main_image.source = self.img

        print(self.img)

# Create the screen manager
sm = ScreenManager() # Problem?
sm.add_widget(FirstScreen(name='_first_screen_'))
sm.add_widget(SecondScreen(name='_second_screen_'))
sm.add_widget(ThirdScreen(name='_third_screen_'))

class MyApp(App):
    def build(self):
        return sm

if __name__ == '__main__':
    MyApp().run()
来自kivy.lang导入生成器
从kivy.app导入应用程序
从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.properties导入ObjectProperty、StringProperty
生成器。加载\u字符串(“”)
:
第一屏:
第二屏:
第三屏:
:
名称:''u第一个屏幕'
盒子布局:
方向:“水平”
标签:
id:第一个屏幕标签
文字:“嗨,我是主页”
盒子布局:
方向:“垂直”
按钮:
文字:“好的!”
按:root.manager.current='\u第二屏幕\u'
按钮:
文字:“取消!”
按:app.stop()
:
名称:''u第二个屏幕'
id:文件选择器
盒子布局:
id:文件\u选择器\u框\u布局
方向:“水平”
按钮
正文:“打开”
新闻界:
root.callback\u image\u和其他内容(文件\u选择器\u列表\u视图.selection)
文件选择器列表视图:
id:文件\u选择器\u列表\u视图
:
名称:''u第三个屏幕'
盒子布局:
方向:“垂直”
id:第三个屏幕
标签:
id:主标题
文字:“上传”
大小提示:(1,0.1)
图片:
id:主图像
来源:root.img
尺寸提示:(1,0.75)
盒子布局:
方向:“水平”
填充:10
尺寸提示:(1,0.15)
按钮:
文字:“好的”
尺寸提示:(0.5,1)
按:图像查看器。图像由用户接受(filechooser.selection)
按钮:
文本:“取消”
尺寸提示:(0.5,1)
按:root.manager.current='\u第一屏\u'
""")
类第一屏幕(屏幕):
通过
第二类屏幕(屏幕):
def回调_图像_和_其他_内容(自我、新图像_地址):
#在这里也做其他事情,然后把新的图片地址传下去
新建图像地址=新建图像地址[0]。替换(“\\”,“/”)
第三屏=第三屏()
第三个屏幕。回调图像(新图像地址)
第三类屏幕(屏幕):
img=ObjectProperty(无)
定义初始(自我,**kwargs):
超级(屏幕,自我)。\uuuuu初始化(**kwargs)
def回调图像(自身、新图像地址):
sm.current=“\u第三屏幕\u”
self.img=新图像地址
self.ids.main_image.source=self.img
打印(self.img)
#创建屏幕管理器
sm=ScreenManager()#问题?
sm.add_小部件(FirstScreen(名称=“”“first_screen”))
sm.add_小部件(SecondScreen(名称=''second_screen'))
sm.add_小部件(第三个屏幕(名称=“”“第三个屏幕”)
类别MyApp(应用程序):
def生成(自):
返回sm
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
MyApp().run()

每次使用
some_obj=SomClass()
时,您都在创建一个新对象,在您正在做的情况下,您正在创建一个新的
第三屏幕
,与未观察图像的屏幕不同,解决方案是您必须使用
ScreenManager
和name屏幕访问初始对象

from kivy.lang import Builder
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, StringProperty


Builder.load_string("""
<FirstScreen>:
    BoxLayout:
        orientation: "horizontal"
        Label:
            id: first_screen_label
            text: "Hi, I'm the home page"
        BoxLayout:
            orientation: "vertical"
            Button:
                text: "Okay!"
                on_press: root.manager.current = '_second_screen_'
            Button:
                text: "Cancel!"
                on_press: app.stop()

<SecondScreen>:
    id: file_chooser
    BoxLayout:
        id: file_chooser_box_layout
        orientation: "horizontal"
        Button
            text: "Open"
            on_press: 
                root.callback_image_and_other_stuff(file_chooser_list_view.selection)
        FileChooserListView:
            id: file_chooser_list_view

<ThirdScreen>:
    BoxLayout:
        orientation: "vertical"
        id: third_screen
        Label:
            id: main_title
            text: "Upload"
            size_hint: (1, 0.1)
        Image:
            id: main_image
            source: root.img
            size_hint: (1, 0.75)
        BoxLayout:
            orientation: "horizontal"
            padding: 10
            size_hint: (1, 0.15)
            Button:
                text: "Okay"
                size_hint: (0.5, 1)
                on_press: image_viewer.image_accepted_by_user(filechooser.selection)
            Button:
                text: "Cancel"
                size_hint: (0.5, 1) 
                on_press: root.manager.current = '_first_screen_'   
""")

class FirstScreen(Screen):
    pass

class SecondScreen(Screen):
    def callback_image_and_other_stuff(self, new_image_address):
        if new_image_address:
            third_screen = self.manager.get_screen("_third_screen_")
            # do other stuff here also, then pass new_image_address along
            new_image_address = new_image_address[0].replace("\\", "/")
            third_screen.callback_image(new_image_address)

class ThirdScreen(Screen):
    img = ObjectProperty(None)

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

    def callback_image(self, new_image_address):
        sm.current = "_third_screen_"
        self.img = new_image_address
        self.ids.main_image.source = self.img

        print(self.img)

# Create the screen manager
sm = ScreenManager() # Problem?
sm.add_widget(FirstScreen(name='_first_screen_'))
sm.add_widget(SecondScreen(name='_second_screen_'))
sm.add_widget(ThirdScreen(name='_third_screen_'))

class MyApp(App):
    def build(self):
        return sm

if __name__ == '__main__':
    MyApp().run()
来自kivy.lang导入生成器
从kivy.app导入应用程序
从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.properties导入ObjectProperty、StringProperty
生成器。加载\u字符串(“”)
:
盒子布局:
方向:“水平”
标签:
id:第一个屏幕标签
文字:“嗨,我是主页”
盒子布局:
方向:“垂直”
按钮:
文字:“好的!”
按:root.manager.current='\u第二屏幕\u'
按钮:
文字:“取消!”
按:app.stop()
:
id:文件选择器
盒子布局:
id:文件\u选择器\u框\u布局
方向:“水平”
按钮
正文:“打开”
新闻界:
root.callback\u image\u和其他内容(文件\u选择器\u列表\u视图.selection)
文件选择器列表视图:
id:文件\u选择器\u列表\u视图
:
盒子布局:
方向:“垂直”
id:第三个屏幕
标签:
id:主标题
文字:“上传”
大小提示:(1,0.1)
图片:
id:主图像
来源:root.img
尺寸提示:(1,0.75)
盒子布局:
方向:“水平”
填充:10
尺寸提示:(1,0.15)
按钮:
文字:“好的”
尺寸提示:(0.5,1)
按:图像查看器。图像由用户接受(filechooser.selection)
按钮:
文本:“取消”
尺寸提示:(0.5,1)
按:root.manager.current='\u第一屏\u'
""")
类第一屏幕(屏幕):
通过
第二类屏幕(屏幕):
def回调_图像_和_其他_内容(自我、新图像_地址):
如果是新的图像地址:
第三个屏幕=self.manager.get\u屏幕(“第三个屏幕”)
#在这里也做其他事情,然后把新的图片地址传下去
新建图像地址=新建图像地址[0]。替换(“\\”,“/”)
第三个屏幕。回调图像(新图像地址)
第三类屏幕(屏幕):
img=ObjectProperty(无)
定义初始(自我,**kwargs):
超级(屏幕,自我).\u初始化__(**