导入kivy.core.window并使用多处理库时出现问题

2024-09-28 21:58:39 发布

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

首先,我想澄清一下,作为一名软件工程师,我有绝对0的背景,这是我第一次在API和创建excel/plots之外使用python

我的问题是,我试图使用kivy创建一个应用程序,然后我导入了kivy.core.window库,出现了一个空白屏幕

我已经看到,当使用kivy和多处理时,这个问题相当普遍,但我发现的信息都没有解决我的问题。在没有kivy.core.window库的情况下运行我的代码的结果:

enter image description here

添加所述库时的结果:

enter image description here

此外,如果我等待10秒,空白屏幕消失,并杀死计数时间进程。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition
import time
from datetime import datetime
import multiprocessing as mp
from multiprocessing import Process, Queue, freeze_support

Builder.load_string('''
<TestScreen>:
    BoxLayout:
        orientation: "vertical" # place object vertically
        Label:
            size_hint: 1, 1
            text: 'TITLE'
            font_size: 150
            color: 1, 1, 1, 1
        Button:
            text: 'start'
            on_press: root.start_mp()
        Button:
            text: 'stop'
            on_press: root.stop_time()
''')

def count_time(x):
    for i in range(x):
        print('count={}'.format(i))
        time.sleep(1)

class Test(App):

    def build(self):
        sm.add_widget(TestScreen(name='test'))
        return sm

class TestScreen(Screen):
    def __init__(self, **kwargs):
        super(TestScreen, self).__init__(**kwargs)
        
    def start_mp(self):
        self.p1 = mp.Process(target=count_time, args=(10, ))
        self.p1.start()

    def stop_time(self):
        pass


if __name__ == '__main__':
    mp.freeze_support()
    sm = ScreenManager(transition=NoTransition())
    Test().run()

Tags: textfromcoreimportselftimedefcount
1条回答
网友
1楼 · 发布于 2024-09-28 21:58:39

问题是,当您运行Process时,它会启动一个新的python进程并导入当前的.py文件。在大多数平台上,生产线:

if __name__ == '__main__':

保护Test().run()不被执行和启动另一个App,并且足以保护不被打开的另一个窗口。但是,在导入原始.py文件进行多处理时,导入kivy.core.window似乎足以打开另一个窗口(在Windows平台上)。你可以读到它

一个非常难看的解决方法是用if __name__ == '__main__':行保护所有kivy导入(以及所有kivy代码)。像这样:

import time
import multiprocessing as mp

def count_time(x):
    for i in range(x):
        print('count={}'.format(i))
        time.sleep(1)


if __name__ == '__main__':
    mp.freeze_support()
    from kivy.core.window import Window
    from kivy.app import App
    from kivy.lang import Builder
    from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition

    Builder.load_string('''
<TestScreen>:
    BoxLayout:
        orientation: "vertical" # place object vertically
        Label:
            size_hint: 1, 1
            text: 'TITLE'
            font_size: 150
            color: 1, 1, 1, 1
        Button:
            text: 'start'
            on_press: root.start_mp()
        Button:
            text: 'stop'
            on_press: root.stop_time()
    ''')


    class Test(App):

        def build(self):
            sm = ScreenManager(transition=NoTransition())
            sm.add_widget(TestScreen(name='test'))
            return sm


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

        def start_mp(self):
            self.p1 = mp.Process(target=count_time, args=(10,))
            self.p1.start()

        def stop_time(self):
            pass


    Test().run()

相关问题 更多 >