特定の処理を開始した場合にコンソール画面を出現させたい
pywなどの拡張子による表示・非表示の切り替えではなく
通常時は非表示の状態で特定の処理を実行した際に
プログラム内で表示を切り替える方法などはあるのでしょうか?
参考
以下のソフトは動画のコンバーターソフトですが
通常起動時はコンソール画面の表示などはなく
コンバートを開始する事でコンソール画面が表示され
進捗状況が確認できる仕様になっています。
参考:handbrake
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
特定の処理が外部プログラム呼び出しになってるのではないでしょうか。
それ以外(ソフトを起動したコンソールの表示・非表示)なら
プラットフォーム依存のAPIを呼び出す事になります。
通常はコンソールの表示・非表示切り替えのようなことはあまりしません。
メインの処理が単体の独立した実行ファイルで、
後付けのGUIから呼び出されて一時的にコンソールが表示されるという構成は、
他でも見かけたことがあります。
main.py
python
1#!/usr/bin/env python3.8 2 3import tkinter as tk 4from functools import partial 5import logging 6import subprocess 7from concurrent.futures import ThreadPoolExecutor 8 9# NOTE: for windows only 10import ctypes 11kernel32 = ctypes.windll.kernel32 12user32 = ctypes.windll.user32 13 14 15def run_program(executor): 16 def proc(): 17 logging.info("call external program") 18 subprocess.call("py -3.8 test.py") 19 20 def done(future): 21 logging.info("DONE") 22 23 future = executor.submit(proc) 24 future.add_done_callback(done) 25 26 27def set_console_visible(show): 28 # pyw で起動した場合は、元々のコンソールがないので 29 # 以下のコードでの表示・非表示は働きません 30 hWnd = kernel32.GetConsoleWindow() 31 if hWnd: 32 user32.ShowWindow(hWnd, show) 33 34show_console = partial(set_console_visible, 1) 35hide_console = partial(set_console_visible, 0) 36 37 38def main(): 39 logging.basicConfig(level=logging.DEBUG, 40 format="[%(threadName)s] %(message)s") 41 42 # 非表示のままプログラムを終了してしまわないように 43 # 終了時に必ず表示に戻す。クラッシュ等の強制終了には対応できません。 44 # 別プロセスで起動等の工夫が必要です。 45 import atexit 46 atexit.register(show_console) 47 48 executor = ThreadPoolExecutor(thread_name_prefix="worker") 49 run_command = partial(run_program, executor) 50 51 root = tk.Tk() 52 button1 = tk.Button(root, text="Run", command=run_command) 53 button2 = tk.Button(root, text="Show", command=show_console) 54 button3 = tk.Button(root, text="Hide", command=hide_console) 55 button1.grid(row=0, column=0) 56 button2.grid(row=0, column=1) 57 button3.grid(row=0, column=2) 58 root.mainloop() 59 60 # スレッドプール内で起動している外部プロセスの完了を待つ 61 executor.shutdown() 62 63 64if __name__ == '__main__': 65 main() 66
subsystem.call で呼び出す外部プログラム test.py
python
1#!/usr/bin/env python3.8 2 3def main(): 4 import time 5 for num in range(10): 6 print(num) 7 time.sleep(1) 8 9if __name__ == '__main__': 10 main()
投稿2020/09/18 07:02
編集2020/09/18 11:41総合スコア8760
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/18 07:39