質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

3839閲覧

Python Kivy | multiprocessを含むメソッドを使用した際に白い応答のない画面が出る

DailyYamazaki

総合スコア16

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/12/28 07:22

ボタンを押すとあるプログラムが起動し、そのプログラムの停止、および他の動作をKivyのGUI上で行う実装を目指しています。

ボタン押した際にmultiprocessによるプロセスが実行されるようにした下記の物を実行したところmultiprocessのプロセスが動いている間に最初に表示されたkivyの画面とは別に白い画面(応答なしのような状態で操作できない)が表示されます。

この白い画面が表示されないようにする方法はないでしょうか。
またmultiprocess以外を用いる実装の方法があればご教示願いたいです。

python

1from kivy.app import App 2from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition 3from kivy.core.text import LabelBase, DEFAULT_FONT 4import time 5from datetime import datetime 6import multiprocessing as mp 7from multiprocessing import Process, Queue, freeze_support 8 9LabelBase.register(DEFAULT_FONT, "ipaexg.ttf") 10sm = ScreenManager(transition=NoTransition()) 11 12def count_time(x): 13 for i in range(x): 14 print('現在のカウントは{}'.format(i)) 15 time.sleep(1) 16 17class Test(App): 18 19 def build(self): 20 sm.add_widget(TestScreen(name='test')) 21 return sm 22 23class TestScreen(Screen): 24 25 p1 = mp.Process(target=count_time, args=(10, )) 26 27 def on_enter(self): 28 pass 29 30 def start_mp(self): 31 self.p1 = mp.Process(target=count_time, args=(10, )) 32 self.p1.start() 33 print("end") 34 35 def stop_time(self): 36 self.p1.terminate() 37 print(datetime.now()) 38 39if __name__ == '__main__': 40 Test().run()

test.kv

test

1<TestScreen>: 2 BoxLayout: 3 orientation: "vertical" # place object vertically 4 Label: 5 size_hint: 1, 1 6 text: 'TITLE' 7 font_size: 150 8 color: 1, 1, 1, 1 9 Button: 10 text: 'start' 11 on_press: root.start_mp() 12 Button: 13 text: 'stop' 14 on_press: root.stop_time() 15

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ウィンドウごとforkしてるんでしょうね。

コードを見た感じ、特にマルチプロセスで実行する必要性はなさそうなので、こっちに置き換えてみてください。

https://docs.python.jp/3/library/threading.html#threading.Thread

引数の与え方などは互換性があるので、multiprocessing.Processをthreading.Threadに置き換えるだけで動くはずです。

追記

効果があるかどうかわかりませんが、メインループが始まる前にforkしておくと行けるかもしれません。

python

1# 略 2from multiprocessing import Pool 3 4# 略 5class TestScreen(Screen): 6 def on_enter(self): 7 pass 8 9 def start_mp(self): 10 p.apply(count_time, args=[10]) 11 print("end") 12 13 def stop_time(self): 14 p.terminate() 15 print(datetime.now()) 16 17if __name__ == '__main__': 18 p = Pool(1) 19 Test().run() 20

投稿2018/12/28 07:28

編集2018/12/28 11:04
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DailyYamazaki

2018/12/28 08:24

今回のコードは質問のために簡略化したもので実際にはthreadingではなくmultiprocessingが必要なのですがこの際はこの白い画面の出現は避けられないのでしょうか。
hayataka2049

2018/12/28 11:04

追記の方法でいけませんか
DailyYamazaki

2018/12/28 11:51

forkした時点で白いブランクの画面が発生してしまうようです。 またメインループを開始しなくてもforkした時点で白いブランクの画面が発生してしまいます。
hayataka2049

2018/12/28 12:00

kivy関連のimportより上に p = Pool(1)を書いてみてください(Pool自体のimportなどの順番は調整した上で)。
DailyYamazaki

2018/12/28 13:15 編集

何度もありがとうございます。 p=Pool(1)を先に書いたところ、 1. RuntimeError: を常に出し続けながらGUIが起動する(プロセスがprintするはずのものがprintされていないのでprocess自体が起動していない?) 2. stopによりprocessをterminateするとエラーが消える 3. startにより再度processを起動を試みるとAssertionErrorによりメインループが終了する の3点が確認できました。 (RuntimeErrorは以下のリンクのものと同じものです。https://stackoverflow.com/questions/18204782/runtimeerror-on-windows-trying-python-multiprocessing)
hayataka2049

2018/12/28 16:15

なにか厳しい事情があるのかもしれません。申し訳ありませんが、私からこれ以上サポートできることはたぶんありません。
guest

0

sm = ScreenManager(transition=NoTransition())の位置をTest().run()の手前までずらせば発生しないようです。

https://stackoverflow.com/questions/53958656/when-running-python-kivy-program-including-multiprocessing-white-blank-screen

投稿2019/01/01 08:27

DailyYamazaki

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問