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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

621閲覧

Popen で二つの引数を渡したい。

Aki1000

総合スコア78

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/14 06:36

編集2018/11/14 06:37

引数に文字列と秒数を渡すと吹き出しを指定時間表示するコードを作っています。これを他のコードからPopenで必要時に呼び出して画面上に吹き出し文字を指定秒数出す予定です。

Python

1#coding:utf-8 2from tkinter import Tk,StringVar,Label 3def fukidasi(*mes, setTime = 2): 4 width = 900 5 height = 150 6 x = 50 7 y = 50 8 root = Tk() 9 root.option_add('*font', (u'MS ゴシック', 40)) 10 root.geometry('{}x{}+{}+{}'.format(width, height, x, y)) 11 root.attributes("-topmost", True) 12 13 setTime = setTime*1000 14 15 buff = StringVar() 16 buff.set('') 17 18 Label(textvariable=buff).pack() 19 20 def endup(): 21 root.quit() 22 exit() 23 24 def show_text(): 25 buff.set(mes) 26 root.after(setTime, endup) 27 28 show_text() 29 root.mainloop()

Python

1from multiprocessing import Process 2from module import fukidasi 3def main(): 4 i1 = Process(target=fukidasi, args=("吹き出しテスト")) 5 i1.start() 6 #ここからメインの処理 7 i1.terminate() 8if __name__ == "__main__": 9 main()

とすれば、動くのですが、秒数指定が出来ません。
Popenで2番目とか3番目の引数を渡すのはどうしたらいいのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

Processのコンストラクタはargskwargsを取り、それぞれ引数のtupledictを渡すことで通常の引数、キーワード引数を指定できます。ちなみに質問文のコードの("吹き出しテスト")tupleになっておらず、間違っています。

17.2. multiprocessing — プロセスベースの並列処理 — Python 3.6.5 ドキュメント

今回はキーワード引数なので、こんな感じで。

python

1 i1 = Process(target=fukidasi, args=("吹き出しテスト",), kwargs={"setTime":2})

投稿2018/11/14 06:43

編集2018/11/14 07:13
hayataka2049

総合スコア30933

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

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

Aki1000

2018/11/14 07:09

i1 = Process(target=fukidasi, args=("吹き出しテスト",), kargs={"setTime":2}) と書き換えると TypeError: __init__() got an unexpected keyword argument 'kargs'となって動かないです。 もしかしてkargsを受ける側も何か工夫がいるのでしょうか? def fukidasi(*mes, setTime = 2): として引数を受けているのですが…… あと、kargs無しのものを動かしてみましたが、("吹き出しテスト",)でも、("吹き出しテスト")でも同じ動作するのですが、元のコードはタプル型として渡せていないのに何で動作するんでしょう……
hayataka2049

2018/11/14 07:13

すみません、単純に私の回答が間違っていました。正しくはkwargsです。
hayataka2049

2018/11/14 07:15

tupleの件に関しては、tuple型以外(というかシーケンス型以外?)なら単一の引数として解釈するみたいな実装になっているのだと思います。深く追求はしません。
Aki1000

2018/11/15 04:00

ありがとうございます。 dict型いいですね! おかげで、第二引数以下も、 i1 = Process(target=fukidasi, args=("吹き出しテスト",), kwargs={"setTime": 2, "x":120, "y":10,"width":800,"height": 80}) という形で渡すことが出来ました。
Aki1000

2018/11/15 04:04 編集

……というか 呼び出し先のpyファイルの関数のところで def fukidasi(*mes, setTime = 2, x=50, y=50,width = 900,height = 150 ): を def fukidasi(mes, setTime = 2, x=50, y=50,width = 900,height = 150 ): と*mesをmesに直すと、 i1 = Process(target=fukidasi, kwargs={"mes":"吹き出しテスト","setTime": 2, "x":120, "y":10,"width":800,"height": 80}) で、argsなしでいけますね………どっちがいいんでしょう。
hayataka2049

2018/11/15 04:13

どっちでも良いんじゃないでしょうか。単に扱いやすい方で
Aki1000

2018/11/15 04:50

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問