导入 kivy.core.window 和使用多处理库时出现问题
Issue when importing kivy.core.window and using the multiprocessing library
首先,我想澄清一下,作为一名软件工程师,我的背景完全是零,这是我第一次使用 python 除了 API 之外的东西并创建 excel/plots.
我的问题是,我尝试使用 kivy 创建一个应用程序,然后我导入了 kivy.core.window
库,出现空白屏幕。
我发现这个问题在使用 kivy 和多处理时相当普遍,但是我找到的 none 信息解决了我的问题。 运行 我的代码没有 kivy.core.window
库的结果:
添加所述库时的结果:
此外,如果我等待 10 秒左右,黑屏就会消失并终止 count_time 进程。
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()
问题是,当您 运行 Process
时,它会启动一个新的 python 进程并导入当前的 .py
文件。在大多数平台上,行:
if __name__ == '__main__':
保护 Test().run()
不被执行并启动另一个 App
并且足以防止另一个 window 被打开。但是,当导入原始 .py
文件进行多重处理时,导入 kivy.core.window
似乎足以打开另一个 window(在 Windows 平台上)。你可以阅读它 here.
一个非常丑陋的解决方法是用 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()
首先,我想澄清一下,作为一名软件工程师,我的背景完全是零,这是我第一次使用 python 除了 API 之外的东西并创建 excel/plots.
我的问题是,我尝试使用 kivy 创建一个应用程序,然后我导入了 kivy.core.window
库,出现空白屏幕。
我发现这个问题在使用 kivy 和多处理时相当普遍,但是我找到的 none 信息解决了我的问题。 运行 我的代码没有 kivy.core.window
库的结果:
添加所述库时的结果:
此外,如果我等待 10 秒左右,黑屏就会消失并终止 count_time 进程。
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()
问题是,当您 运行 Process
时,它会启动一个新的 python 进程并导入当前的 .py
文件。在大多数平台上,行:
if __name__ == '__main__':
保护 Test().run()
不被执行并启动另一个 App
并且足以防止另一个 window 被打开。但是,当导入原始 .py
文件进行多重处理时,导入 kivy.core.window
似乎足以打开另一个 window(在 Windows 平台上)。你可以阅读它 here.
一个非常丑陋的解决方法是用 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()