【问题标题】:Image is not getting displayed from Kivy file图像未从 Kivy 文件中显示
【发布时间】:2019-12-24 12:42:53
【问题描述】:

这是代码以及 kv 文件。

图像未根据微调器选择显示。

我需要在第二个屏幕中显示带有两到三张图片的图片,点击相同的图片时,应该会弹出一个包含详细信息和另一张图片的弹出窗口。

from kivy.app import App
from kivy.uix.behaviors import ButtonBehavior  
from kivy.uix.image import Image  
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.spinner import Spinner
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.screenmanager import SlideTransition
from kivy.lang import Builder
from kivy.config import Config
Config.set('graphics', 'resizable', True) 

kv=Builder.load_string("""
<Image1n>: 
    orientation:'vertical'
    BoxLayout: 
        padding:5
        ImageButton: 
            source: 'anorth.jpg'
            size_hint: 0.6, 0.6
            pos_hint: {'center_x':.1, 'center_y': .8}
            on_release: root.on_press()
    BoxLayout: 
        padding:5
        ImageButton: 
            source:'bnorth.jpg'
            size_hint: 0.8, 0.8
            pos_hint: {'center_x':.1, 'center_y': .2}
            on_release: root.on_press()
<Image1e>: 
    orientation:'vertical'
    BoxLayout: 
        padding:5
        ImageButton: 
            source: 'aeast.jpg'
            size_hint: 0.6, 0.6
            pos_hint: {'center_x':.1, 'center_y': .8}
            on_release: root.on_press1()
    BoxLayout: 
        padding:5
        ImageButton: 
            source:'beast.jpg'
            size_hint: 0.8, 0.8
            pos_hint: {'center_x':.1, 'center_y': .2}
            on_release: root.on_press1()
"""
)
class ImageButton(ButtonBehavior, Image):  
    pass
class Image1n(Screen,BoxLayout):
    pass
class Image1e(Screen,BoxLayout):
    pass
class Image1BHKNorth(Screen,ButtonBehavior, Image,GridLayout):
    def imagebutton1bhknorth(self):
        return kv
    def on_press(self):        
        layout = GridLayout(cols=2,rows=2) 
        popupLabel = Label(text = "         Details"
                           "\n House Type - 1BHK"
                           "\n Area - 800")
        image= Image(source='anorth1.jpg')
        closeButton = Button(text = "Close",size_hint_x=0.1,size_hint_y=0.1)  
        layout.add_widget(popupLabel) 
        layout.add_widget(image)
        layout.add_widget(closeButton)
        popup = Popup(title ='                        Details', 
                      content = layout)   
        popup.open()    
        closeButton.bind(on_press = popup.dismiss)    
class Image1BHKEast(Screen,ButtonBehavior, Image,GridLayout):
    def imagebutton1bhkeast(self):
        return kv
    def on_press1(self):        
        layout = GridLayout(cols=2,rows=2) 
        popupLabel = Label(text = "         Details"
                           "\n House Type - 1BHK"
                           "\n Area - 800\n Direction - North")
        image= Image(source='aeast1.jpg')
        closeButton = Button(text = "Close",size_hint_x=0.1,size_hint_y=0.1)  
        layout.add_widget(popupLabel) 
        layout.add_widget(image)
        layout.add_widget(closeButton)
        popup = Popup(title ='                        Details', 
                      content = layout)   
        popup.open()    
        closeButton.bind(on_press = popup.dismiss)

class CustomScreen(Screen):
    def __init__(self, **kwargs):
        super(CustomScreen, self).__init__(**kwargs)
        layout = BoxLayout(orientation='vertical')
        self.spinnerObject = Spinner(text ="House", 
              values =("1BHK", "2BHK", "3BHK"), 
              background_color =(0.784, 0.443, 0.216, 1))  

        self.spinnerObject.size_hint = (0.2, 0.2) 

        self.spinnerObject.pos_hint ={'x': .35, 'y':.40}
        layout.add_widget(self.spinnerObject)
        #spinner-selection
        self.spinnerObject.bind(text=self.spinner_select)
        self.spinnerSelection = Label(text="%s"%self.spinnerObject.text)
        layout.add_widget(self.spinnerSelection)
        self.spinnerSelection.pos_hint={'x': .1, 'y':.3}
        #second spinner
        self.spinnerObject1 = Spinner(text ="Area", 
              values =("800","1200", "1500", "1800", "2200"), 
              background_color =(0.784, 0.443, 0.216, 1))  
        self.spinnerObject1.size_hint = (0.2, 0.2) 

        self.spinnerObject1.pos_hint ={'x': .35, 'y':.40} 

        layout.add_widget(self.spinnerObject1)
        #spinner-selection
        self.spinnerObject1.bind(text=self.spinner_select)
        self.spinnerSelection1 = Label(text="%s"%self.spinnerObject1.text)
        layout.add_widget(self.spinnerSelection1)
        self.spinnerSelection1.pos_hint={'x': .1, 'y':.3}
        #third spinner
        self.spinnerObject2 = Spinner(text ="Directions", 
              values =("North","East"), 
              background_color =(0.784, 0.443, 0.216, 1))  
        self.spinnerObject2.size_hint = (0.2, 0.2)       
        self.spinnerObject2.pos_hint ={'x': .35, 'y':.20}       
        layout.add_widget(self.spinnerObject2)
        #spinner-selection
        self.spinnerObject2.bind(text=self.spinner_select)
        self.spinnerSelection2 = Label(text="%s"%self.spinnerObject2.text)
        layout.add_widget(self.spinnerSelection2)
        self.spinnerSelection2.pos_hint={'x': .1, 'y':.3}

        layout.add_widget(Label(text=self.name, font_size=30))
        navig = BoxLayout(size_hint=(0.2,0.4),pos_hint={'top': 1, 'center_x':0.5})
        next = Button(text='Search')
        next.bind(on_release=self.switch_next)
        navig.add_widget(next)
        layout.add_widget(navig)
        self.add_widget(layout)
    def spinner_select(self,spinner,text):
        self.spinnerSelection.text = "%s"%self.spinnerObject.text
        self.spinnerSelection1.text = "%s"%self.spinnerObject1.text
        self.spinnerSelection2.text = "%s"%self.spinnerObject2.text

        self.ib=Image1BHKNorth()
        self.ib1=Image1BHKEast()
        if self.spinnerSelection.text=='1BHK'and self.spinnerSelection1.text=='800' and self.spinnerSelection2.text=='North':
            self.ib.imagebutton1bhknorth()
            sm.add_widget(Image1BHKNorth(name='onebhkn'))
        if self.spinnerSelection.text=='1BHK'and self.spinnerSelection1.text=='800' and self.spinnerSelection2.text=='East':
            self.ib1.imagebutton1bhkeast()
            sm.add_widget(Image1BHKEast(name='onebhke'))


    def switch_next(self, *args):
        self.manager.transition = SlideTransition(direction="right")
        self.manager.current = self.manager.next()

sm = ScreenManager()
sm.add_widget(CustomScreen())

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

if __name__ == '__main__':
    SA().run()  

修订:

条件正常,因为弹出窗口显示了条件图像。唯一的问题是 kv 文件中的图像(预计垂直显示两个图像)没有显示(我得到的只有一个空白屏幕)。弹出图像与给定的内容一起完美显示。

【问题讨论】:

  • 能否请您添加您项目的结构示例?只是为了检查您要显示的图像在哪里^^
  • @JorgeC.M 我实际上使用 Anaconda spyder 作为 IDE,并将图像保存在保存我的代码的文件夹中。没有给出条件时,图像正在显示。
  • 我明白了...您能检查(打印)在self.spinnerSelection.text = "%s"%self.spinnerObject.textlines 之后的微调器文本的值吗?也许文本值与您检查的值不同,然后它不会在 if 子句中输入
  • @JorgeC.M 选择的微调器中的文本正在正确显示self.spinnerSelection.text = "%s"%self.spinnerObject.text 这行代码。可能还有其他一些逻辑错误,因为布局显示在角落,点击时也会弹出一个窗口。
  • 您的代码存在一些严重问题。首先,您的“kv”字符串实际上没有被使用。您在代码中引用它,但实际上您并没有对它做任何事情。您在 Image1n、Image1e、Image1BHKNorth 和 Image1BHKEast 类中进行了一些危险的多重继承。在每个类中,您都在扩展Screen 类(它本身扩展RelativeLayout)以及另一个Layout 类(GridLayout 或BoxLayout)。所有这三个Layout 类都有自己的do_layout() 方法。您希望使用哪一个?

标签: python python-3.x kivy kivy-language


【解决方案1】:

这是您的代码的修改版本,我认为它可以满足您的需求。我在代码中添加了许多 cmets 来解释我所做的更改。

我注意到在几个地方你正在做多重继承(有些是冲突的)。当您需要您的子类成为超类的实例时,您应该只进行子类化。就像您的 ImageButton 是具有 ButtonBehavior 的 Image 一样。但是,每当您考虑扩展一个类时,请考虑在您的类中包含该类的一个实例是否更好。例如,您的Image1BHKNorth 扩展了Image,但这真的需要吗?您无需扩展 Image 即可在您的类中使用 Image 实例。

# any changes to Config should be the first thing done!!!
from kivy.config import Config
Config.set('graphics', 'resizable', 1)

from kivy.app import App
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.image import Image
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.spinner import Spinner
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.screenmanager import SlideTransition
from kivy.lang import Builder

# use Builder.load_string() to tell Kivy about your rules for building Widgets
Builder.load_string("""
# A rule that says how a Image1BHKEast Widget should be built
<Image1BHKEast>:
    Image1e:          # Image1e is just a BoxLayout, so this could be replaced by simply BoxLayout:
        padding:5
        orientation:'vertical'
        ImageButton: 
            source: 'anorth.jpg'
            allow_stretch: True    # allows the image to be stretched to fill the specified size
            keep_ratio: True       # keeps the aspect ratio of the image constant, to avoid distortion
            size_hint: 0.6, 0.6
            pos_hint: {'center_x':.1, 'center_y': .8}  # odd positioning (the left side of the image will likely be off screen)
            on_release: root.on_press1()
        ImageButton: 
            source:'bnorth.jpg'
            allow_stretch: True
            keep_ratio: True
            size_hint: 0.8, 0.8
            pos_hint: {'center_x':.1, 'center_y': .2}
            on_release: root.on_press1()

# similar rule for Image1BHKNorth
<Image1BHKNorth>:
    Image1n:
        padding:5
        orientation:'vertical'
        ImageButton: 
            source: 'aeast.jpg'
            allow_stretch: True
            keep_ratio: True
            size_hint: 0.6, 0.6
            pos_hint: {'center_x':.1, 'center_y': .8}
            on_release: root.on_press()
        ImageButton: 
            source:'beast.jpg'
            allow_stretch: True
            keep_ratio: True
            size_hint: 0.8, 0.8
            pos_hint: {'center_x':.1, 'center_y': .2}
            on_release: root.on_press()
"""
)
class ImageButton(ButtonBehavior, Image):
    pass

# The two classes below extended Screen, but were never used as Screen
# They now only extend BoxLayout
# If there is no additional behavior required of these classes, they can be eliminated completely
class Image1n(BoxLayout):
    pass
class Image1e(BoxLayout):
    pass

# Eliminated uneeded parent classes
# When extending Behavior classes, The Behavior class must be listed first
# eliminated the imagebutton1bhknorth() method as it provided no useful functionality
class Image1BHKNorth(ButtonBehavior, Screen):
    def on_press(self):
        print(self.size)
        layout = GridLayout(cols=2,rows=2)
        popupLabel = Label(text = "         Details"
                           "\n House Type - 1BHK"
                           "\n Area - 800")
        image= Image(source='anorth1.jpg')
        closeButton = Button(text = "Close",size_hint_x=0.1,size_hint_y=0.1)
        layout.add_widget(popupLabel)
        layout.add_widget(image)
        layout.add_widget(closeButton)
        popup = Popup(title ='                        Details',
                      content = layout)
        popup.open()
        closeButton.bind(on_press = popup.dismiss)

# same comments as above
class Image1BHKEast(ButtonBehavior, Screen):
    def on_press1(self):
        layout = GridLayout(cols=2,rows=2)
        popupLabel = Label(text = "         Details"
                           "\n House Type - 1BHK"
                           "\n Area - 800\n Direction - North")
        image= Image(source='aeast1.jpg')
        closeButton = Button(text = "Close",size_hint_x=0.1,size_hint_y=0.1)
        layout.add_widget(popupLabel)
        layout.add_widget(image)
        layout.add_widget(closeButton)
        popup = Popup(title ='                        Details',
                      content = layout)
        popup.open()
        closeButton.bind(on_press = popup.dismiss)

class CustomScreen(Screen):
    def __init__(self, **kwargs):
        super(CustomScreen, self).__init__(**kwargs)
        layout = BoxLayout(orientation='vertical')
        self.spinnerObject = Spinner(text ="House",
              values =("1BHK", "2BHK", "3BHK"),
              background_color =(0.784, 0.443, 0.216, 1))

        self.spinnerObject.size_hint = (0.2, 0.2)

        self.spinnerObject.pos_hint ={'x': .35, 'y':.40}
        layout.add_widget(self.spinnerObject)
        #spinner-selection
        self.spinnerObject.bind(text=self.spinner_select)
        self.spinnerSelection = Label(text="%s"%self.spinnerObject.text)
        layout.add_widget(self.spinnerSelection)
        self.spinnerSelection.pos_hint={'x': .1, 'y':.3}
        #second spinner
        self.spinnerObject1 = Spinner(text ="Area",
              values =("800","1200", "1500", "1800", "2200"),
              background_color =(0.784, 0.443, 0.216, 1))
        self.spinnerObject1.size_hint = (0.2, 0.2)

        self.spinnerObject1.pos_hint ={'x': .35, 'y':.40}

        layout.add_widget(self.spinnerObject1)
        #spinner-selection
        self.spinnerObject1.bind(text=self.spinner_select)
        self.spinnerSelection1 = Label(text="%s"%self.spinnerObject1.text)
        layout.add_widget(self.spinnerSelection1)
        self.spinnerSelection1.pos_hint={'x': .1, 'y':.3}
        #third spinner
        self.spinnerObject2 = Spinner(text ="Directions",
              values =("North","East"),
              background_color =(0.784, 0.443, 0.216, 1))
        self.spinnerObject2.size_hint = (0.2, 0.2)
        self.spinnerObject2.pos_hint ={'x': .35, 'y':.20}
        layout.add_widget(self.spinnerObject2)
        #spinner-selection
        self.spinnerObject2.bind(text=self.spinner_select)
        self.spinnerSelection2 = Label(text="%s"%self.spinnerObject2.text)
        layout.add_widget(self.spinnerSelection2)
        self.spinnerSelection2.pos_hint={'x': .1, 'y':.3}

        layout.add_widget(Label(text=self.name, font_size=30))
        navig = BoxLayout(size_hint=(0.2,0.4),pos_hint={'top': 1, 'center_x':0.5})
        next = Button(text='Search')
        next.bind(on_release=self.switch_next)
        navig.add_widget(next)
        layout.add_widget(navig)
        self.add_widget(layout)

    def spinner_select(self,spinner,text):
        self.spinnerSelection.text = "%s"%self.spinnerObject.text
        self.spinnerSelection1.text = "%s"%self.spinnerObject1.text
        self.spinnerSelection2.text = "%s"%self.spinnerObject2.text

        # Eliminated ineffective Widget creation and method calls
        if self.spinnerSelection.text=='1BHK'and self.spinnerSelection1.text=='800' and self.spinnerSelection2.text=='North':
            sm.add_widget(Image1BHKNorth(name='onebhkn'))
        if self.spinnerSelection.text=='1BHK'and self.spinnerSelection1.text=='800' and self.spinnerSelection2.text=='East':
            sm.add_widget(Image1BHKEast(name='onebhke'))


    def switch_next(self, *args):
        self.manager.transition = SlideTransition(direction="right")
        self.manager.current = self.manager.next()

sm = ScreenManager()
sm.add_widget(CustomScreen(name='main'))    # All Screens need a name

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

if __name__ == '__main__':
    SA().run()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    相关资源
    最近更新 更多