Python Kivy:更改屏幕上的图像源
在做了很多头晕之后,我创建了一个应用程序,可以打开FileChooser并选择一个图像。然后,一个函数将变换图像并在屏幕上进行更改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
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初始化__(**