如何在Kivy中以弹窗加载图像

3 投票
1 回答
2692 浏览
提问于 2025-04-17 20:48
def pop1(self):
    pop = Popup(title='test',content=Image('boy.png'),
                size_hint=(None,None))
    pop.open()

然后在kv语言中,我尝试从按钮的按下事件中调用它。kv文件的代码是这样的。

    BoxLayout:
    size:self.parent.size
    orientation:'horizontal'
    spacing:10
    padding:5
    Button:
        text:
        size_hint:.3,.3
        on_press: 
            root.pop1()

当我尝试运行它时,出现了如下错误:

: _container: container GridLayout: padding: 12 keyError: 'pos_hint'

1 个回答

6

首先,你调用了 root.pop1(),而这里的 root 是一个 BoxLayout,我猜想你是在一个叫 BoxLayout 的类里定义了你的 pop1 函数,并且这个类是从 BoxLayout 继承来的?如果是这样的话,你实际上是在覆盖一个 kivy 的类,这样会导致一些问题。

第二个问题是,你调用了 Image('boy.png'),其实应该是 Image(source='boy.png')

最后,在按钮的设置中,你忘记给 text 赋值了。

要更好地实现你想要的功能,可以使用以下代码:

from kivy.app import runTouchApp
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.uix.image import Image
from kivy.lang import Builder


kv = '''
BoxLayoutWithPopup:
    orientation:'horizontal'
    spacing:10
    padding:5
    Button:
        text: 'Press me'
        size_hint:.3,.3
        on_press:
            root.pop1()
'''


class BoxLayoutWithPopup(BoxLayout):

    def pop1(self):
        pop = Popup(title='test', content=Image(source='boy.png'),
                    size_hint=(None, None), size=(400, 400))
        pop.open()


if __name__ == '__main__':
    runTouchApp(Builder.load_string(kv))

撰写回答