创建一个 kivy 应用程序以在一个屏幕上接收用户的输入并在另一个屏幕上显示这些图像

Posted

技术标签:

【中文标题】创建一个 kivy 应用程序以在一个屏幕上接收用户的输入并在另一个屏幕上显示这些图像【英文标题】:Create a kivy application to take input from user in one screen and display those many images in other screen 【发布时间】:2021-06-29 20:28:28 【问题描述】:

我正在尝试创建一个应用程序,该应用程序将在我的 PC 中显示来自某个路径的图像。 我想根据用户输入显示这些图像。假设用户给了一个数字 5,那么它将在该路径中随机显示 5 张图像。

【问题讨论】:

【参考方案1】:

这是一个基本的示例应用程序,它应该使用纯 python(无 KV 语言)完成您所要求的工作。只是说,在显示图像时,您可能需要考虑添加滚动视图以查看完整图像。目前,我通过指定 size_hint(.3,.3) 来“缩小”它们。此外,您想找到一种更好的方法来过滤掉不是图像的文件,我通过检查文件路径是否以“.jpg”或“.png”结尾来创建一个基本过滤器,您可以执行此正则表达式或使用全局库。

import os, random

from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.stacklayout import StackLayout
from kivy.uix.textinput import TextInput
from kivy.uix.image import Image
from kivy.properties import ListProperty, NumericProperty

class Screen2(Screen):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.layout = StackLayout()
        self.random_image_number = App.get_running_app().images_num
        self.images_paths = App.get_running_app().images_paths
        self.random_paths = random.choices(self.images_paths, k=self.random_image_number)

        for path in self.random_paths:
            # You may wanna change the size_hint or add a scrollview if you want full size images
            img = Image(source=path,size_hint=(.3,.3))
            self.layout.add_widget(img)

        self.add_widget(self.layout)

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

        # Add your path here
        self.image_path = os.path.join("C:\\Users\\dimit\\Pictures")
        self.layout = RelativeLayout()
        self.input_bar = TextInput(multiline=False, size_hint=(0.4, 0.1), pos_hint="center_x":.5, "center_y":.5, hint_text="How many images to show", input_type="number")
        self.input_bar.bind(on_text_validate=self.get_images)
        self.layout.add_widget(self.input_bar)
        self.add_widget(self.layout)

    # inst refers to the input bar object
    def get_images(self, inst):
        App.get_running_app().images_num = int(inst.text)
        for fname in os.scandir(self.image_path):
            # Skip any directories
            if fname.is_dir():
                continue
            
            # Filter for images 
            if fname.path.endswith(".jpg") or fname.path.endswith(".png"):
                App.get_running_app().images_paths.append(fname.path)

        # This line needs to be here, because if you add the screen in the build method, it wont add the images
        App.get_running_app().screen_manager.add_widget(Screen2(name="Image Display Page"))

        # Changes screen to image display screen 
        App.get_running_app().screen_manager.current = "Image Display Page"

class ImageApp(App):
    images_paths = ListProperty([])
    images_num = NumericProperty(0)
    def build(self):
        self.title = "Image Display App"
        self.screen_manager = ScreenManager()
        self.screen_manager.add_widget(Screen1(name="Home Page"))
    
        return self.screen_manager


if __name__ == "__main__":
    ImageApp().run()
        

【讨论】:

这是我得到的错误: Traceback(最近一次调用最后一次):文件“C:/Users/harsh/PycharmProjects/pythonProject1/venv/WiseTime.py”,第 5 行,在 from kivymd.uix.MDRelativeLayout import MDRelativeLayout ModuleNotFoundError: No module named 'kivymd.uix.MDRelativeLayout' Process finished with exit code 1 你安装了kivymd吗? @SriHarsha 当我阅读你的问题时,我以为你想使用KivyMD。我编辑了我的答案,所以它只会使用 Kivy 而不是 KivyMD 导入。

以上是关于创建一个 kivy 应用程序以在一个屏幕上接收用户的输入并在另一个屏幕上显示这些图像的主要内容,如果未能解决你的问题,请参考以下文章

Python Kivy - 在另一个屏幕上显示动态结果

向 Kivy 添加小部件时如何确保功能正常

流数据架构

无法在kivy上校准触摸屏

如何在 KivyMD 的 .kv 文件中使用 kivy 中的数据表?

Kivy - 另一个屏幕上的滑块类值更改