微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Kivy FileChooser 重叠

如何解决Kivy FileChooser 重叠

我正在使用 kivy 的 FileChooserListView,并且遇到了另一个用户也遇到的 overlapping text on scroll with screens。我浏览了他们的 post on GitHub 并了解到有些人正在使用 plyer FileChooser。我也看到有人提到它与.kv文件的Building功能有关。我创建了一个新的 kivy 应用程序并且没有出现问题,但是当我返回到我的旧应用程序(没有任何类型的更改)时,问题仍然存在。

抱歉这篇长文章,但我不确定这两个 kivy 应用程序代码有何不同。我是否两次调用导致 FileChooser “保持”它的位置的东西?我不反对使用 plyer 的 FileChooser,但有人可以给我一个如何实现它的例子吗?

testing_kivy.py

from kivy.app import App
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.uix.popup import Popup
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
import os


def train_load(path,filename):
    download_path = os.path.join(path,filename[0])
    print(download_path)


class LoadDialog(FloatLayout):
    load = ObjectProperty(None)
    cancel = ObjectProperty(None)


class TrainingWindow(Screen):
    def show_load_list(self):
        content = LoadDialog(load=train_load,cancel=self.dismiss_popup)
        self._popup = Popup(title="Load a file list",content=content,size_hint=(1,1))
        self._popup.open()

    def dismiss_popup(self):
        self._popup.dismiss()


class WindowManager(ScreenManager):
    pass


kv_training = Builder.load_file('testing_kivy.kv')


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


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

testing_kivy.kv

WindowManager:
    TrainingWindow:


<TrainingWindow>
    name: "training"

    BoxLayout:
        orientation: "vertical"
        Button:
            text: "Select Training Images"
            font_size: 32
            on_release: root.show_load_list()
        Button:
            text: "Select Training Annots"
            font_size: 32
            on_release: root.show_load_list()

        Button:
            text: "Set Parameters"
            font_size: 32
            on_release:
                app.root.current = "parameters_train"
                root.manager.transition.direction = "up"

        Button:
            text: "Back"
            font_size: 16
            on_release:
                app.root.current = "select"
                root.manager.transition.direction = "right"


<LoadDialog>:
    BoxLayout:
        size: root.size
        pos: root.pos
        orientation: "vertical"
        FileChooserListView:
            id: filechooser
        BoxLayout:
            size_hint_y: None
            height: 30
            Button:
                text: "Cancel"
                on_release: root.cancel()
            Button:
                text: "Load"
                on_release: root.load(filechooser.path,filechooser.selection)

enter image description here

Older_app.py

from kivy.app import App
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.Boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.spinner import SpinnerOption
import os
import pandas as pd


def invalid_login():
    app = App.get_running_app()
    app.root.current = "main"
    # Create a BoxLayout to add multiple lines or buttons to a PopUp
    Box = BoxLayout()
    # Create PopUp
    pop = Popup(
        title="Invalid Password",size_hint=(None,None),size=(200,100),content=Box,auto_dismiss=False
    )
    # dismiss PopUp
    Box.add_widget(Button(text="Close",on_release=pop.dismiss))
    pop.open()


def model_load(path,filename[0])
    print(download_path)


def train_load(path,filename[0])
    print(download_path)


def train_model_load(path,filename[0])
    print(download_path)


class MainWindow(Screen):
    def login(self):
        if self.ids.password.text == "password":
            self.ids.password.text = ""
            app = App.get_running_app()
            app.root.current = "select"
        else:
            self.ids.password.text = ""
            invalid_login()


class Selectwindow(Screen):
    pass


class LoadDialog(FloatLayout):
    load = ObjectProperty(None)
    cancel = ObjectProperty(None)


class TrainingWindow(Screen):
    def show_load_list(self):
        content = LoadDialog(load=train_load,1))
        self._popup.open()

    def dismiss_popup(self):
        self._popup.dismiss()


class ModelWindow(Screen):
    def show_load_list(self):
        content = LoadDialog(load=model_load,1))
        self._popup.open()

    def dismiss_popup(self):
        self._popup.dismiss()


class TrainModelWindow(Screen):
    def show_load_list(self):
        content = LoadDialog(load=train_model_load,1))
        self._popup.open()

    def dismiss_popup(self):
        self._popup.dismiss()


class ParametersTrainModelWindow(Screen):
    pass


class ParametersTrainWindow(Screen):
    pass


class WindowManager(ScreenManager):
    pass


class OverViewTrainWindow(Screen):
    pass


class OverViewTrainModelWindow(Screen):
    pass


class OverviewmodelWindow(Screen):
    pass


class MyOption(SpinnerOption):
    pass


kv_main= Builder.load_file('main.kv')


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


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

ma​​in.kv

#:import utils kivy.utils
#:include select.kv
#:include training.kv
#:include model.kv
#:include train_model.kv
#:include parameters_train.kv
#:include parameters_train_model.kv
#:include overview_train_model.kv
#:include overview_train.kv
#:include overview_model.kv

WindowManager:
    MainWindow:
    Selectwindow:
    TrainingWindow:
    ModelWindow:
    TrainModelWindow:
    ParametersTrainWindow:
    ParametersTrainModelWindow
    OverViewTrainWindow:
    OverViewTrainModelWindow:
    OverviewmodelWindow:

<MainWindow>
    name: "main"

    GridLayout:
        cols: 1

        BoxLayout:
            orientation: "vertical"
            canvas.before:
                Color:
                    rgba: 0,1
                Rectangle:
                    pos: self.pos
                    size: self.size
            Label:
                size_hint: 1,1
                text: "SPECPHASE"
                font_size: 50
                color:
                    utils.get_color_from_hex('#FF0000')
            Label:
                size_hint: 1,1
                text: "Object Detection App"
                font_size: 40

        BoxLayout:
            size_hint: 1,0.005
            canvas.before:
                Color:
                    rgba: (1,1,1)
                Rectangle:
                    size: self.size
                    pos: self.pos

        BoxLayout:
            orientation: "horizontal"
            size_hint: (0.35,0.35)
            padding: (0,25,0)

            Label:
                font_size: 20
                text: "Password"
                size_hint: (0.5,0.35)
                pos_hint: {'x': 1,'y': 0.4}
                background_color: (0,1)
                canvas.before:
                    Color:
                        rgba: self.background_color
                    Rectangle:
                        size: self.size
                        pos: self.pos


            TextInput:
                id: password
                multiline: False
                size_hint: (0.5,'y': 0.4}
                focus: True
                background_color:
                    utils.get_color_from_hex('#18B8D9')
                cursor_color: (0,1)
                password: True


        Button:
            text: "Submit"
            on_release: root.login()

select.kv

<Selectwindow@Screen>:
    name: "select"

    GridLayout:
        cols: 1

        GridLayout:
            cols: 2

            Button:
                text: "Train"
                font_size: 32
                on_release:
                    app.root.current = "training"
                    root.manager.transition.direction = "right"
            Button:
                text: "Model"
                font_size: 32
                on_release:
                    app.root.current = "model"
                    root.manager.transition.direction = "left"

        Button:
            text: "Train & Model"
            font_size: 32
            on_release:
                app.root.current = "train_model"
                root.manager.transition.direction = "up"

training.kv

<TrainingWindow@Screen>:
    name: "training"

    BoxLayout:
        orientation: "vertical"
        Button:
            text: "Select Training Images"
            font_size: 32
            on_release: root.show_load_list()
        Button:
            text: "Select Training Annots"
            font_size: 32
            on_release: root.show_load_list()

        Button:
            text: "Set Parameters"
            font_size: 32
            on_release:
                app.root.current = "parameters_train"
                root.manager.transition.direction = "up"

        Button:
            text: "Back"
            font_size: 16
            on_release:
                app.root.current = "select"
                root.manager.transition.direction = "right"


<LoadDialog>:
    BoxLayout:
        size: root.size
        pos: root.pos
        orientation: "vertical"
        FileChooserListView:
            id: filechooser
        BoxLayout:
            size_hint_y: None
            height: 30
            Button:
                text: "Cancel"
                on_release: root.cancel()
            Button:
                text: "Load"
                on_release: root.load(filechooser.path,filechooser.selection)

enter image description here

解决方法

休息片刻,重新启动大脑后,我找到了问题所在。

未包含在我的问题中,我还有几个 .kv 文件的布局与 training.kv 类似。它们用于访问其他 screens。我发现我在每个 FileChooserListView 中都调用了 screen,我相信这就是我看到堆叠问题的原因。除了 training.kv 文件中的一个,我最终删除了所有这些文件,并且一切正常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。