kivy PYTHON中的屏幕管理和加载功能

2024-05-13 16:49:06 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我在做这个有主屏幕和加载屏幕的GUI。使用加载屏幕,以便用户可以在程序执行某个函数时看到应用程序的进度。我希望程序改变以执行函数,并在函数执行后切换回主屏幕。这是我的部分代码,你可以用它来运行你的程序。在

# Imports
import kivy
from kivy.app import App    # Imports functions to build the app
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty, StringProperty
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.uix.image import Image
import threading
import time

kivy.require('1.10.1')


def function1():
    time.sleep(5)
    print("Done")


def function2():
    time.sleep(5)
    print("Done 2")


class MainScreen(Screen, FloatLayout):  # Main Screen Class that holds every method in the Start Screen

    auction_name = " "
    default = "Select an auction"
    selected_auction = StringProperty('Select an auction')
    x_value = 450
    y_value = 500

    def change_label(self, change):  # Changes the text that shows what auction is selected

        strtst = "Selected: " + change

        if self.selected_auction == self.default and (change == "Copart" or change == "IAAI"):
            self.selected_auction = "Selected: " + change
            self.selected_auction = "Selected: " + change
        elif self.selected_auction == strtst or self.selected_auction == "Main":
            self.selected_auction = self.default
        elif change != self.selected_auction:
            if self.selected_auction == "Selected: Copart and IAAI":
                self.selected_auction = "Selected: " + change
            else:
                if change == "None":
                    self.selected_auction == "TO START, PLEASE SELECT AN AUCTION"
                else:
                    self.selected_auction = "Selected: Copart and IAAI"

    def change_screen(self):
        self.manager.current = "Loading Screen"

    t2 = threading.Thread(target=function1)
    t3 = threading.Thread(target=function2)

    def start_process(self):  # Used to start the web scraping
        if self.selected_auction == 'Selected: Copart':
            self.manager.current = "Loading Screen"
            self.t3.start()
            self.manager.current = "Results Screen"
            self.selected_auction = "Select an auction"
        elif self.selected_auction == 'Selected: IAAI':
            self.manager.current = "Loading Screen"
            self.t2.start()
            self.selected_auction = "Select an auction"
        elif self.selected_auction == 'Selected: Copart and IAAI':
            self.manager.current = "Loading Screen"
            self.t2.start()
            self.t3.start()
        else:
            self.change_label("None")


class LoadingScreen(Screen):

    def cancel(self):
        box = BoxLayout(orientation='vertical')
        padding = Label(text= "If you say yes all progress will be lost!")
        buttons = BoxLayout()
        warning = Image(source="Data/warning.png")
        yes_button = Button(text= "Yes, do cancel it.", on_release=lambda x:self.back(),
                        on_press=lambda *args: pop.dismiss(), size=(250, 120), background_color=(300, 0.5, 0, .7))
        no_button = Button(text="No, don't cancel.", on_press=lambda *args: pop.dismiss(), size=(250, 120),
                       background_color=(.25, 150, .04, 0.5))
        box.add_widget(warning)
        box.add_widget(padding)
        buttons.add_widget(yes_button)
        buttons.add_widget(no_button)
        box.add_widget(buttons)

        pop = Popup(title="Do you wish to cancel?", content=box, size_hint=(None, None), size= (800, 500))
        pop.open()


class Manager(ScreenManager):

    main_screen = ObjectProperty(None)
    loading_screen = ObjectProperty(None)


class MainApp(App):

    choice = ""
    source = StringProperty(None)

    def build(self):
        m = Manager(transition=NoTransition())
        return m


if __name__ == "__main__":
    Window.clearcolor = (.46875, .46875, .4765, 1)
    Window.size = (850, 1000)
    MainApp().run()

在主屏幕中,有一个按钮,当按下该按钮时,该按钮将改变屏幕并执行该功能,该功能是使用start_process()处理的。这是我的主电压kv文件:

^{pr2}$

你对我做错了什么有什么建议吗?谢谢你的帮助!在


Tags: fromimportselfnone屏幕defbuttonchange
1条回答
网友
1楼 · 发布于 2024-05-13 16:49:06

以下是运行函数后返回主屏幕的一种方法。将目标函数修改为:

def function1():
    time.sleep(5)
    print("Done")
    Clock.schedule_once(App.get_running_app().show_main_screen)


def function2():
    time.sleep(5)
    print("Done 2")
    Clock.schedule_once(App.get_running_app().show_main_screen)

Clock.schedule_once()计划在主线程上运行的内容(更改UI时需要)。在

并将MainApp修改为:

^{pr2}$

此外,在您的“kv”文件中,行:

manager: screen_manager

不需要。该属性将自动添加到每个Screen。在

相关问题 更多 >