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

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

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

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

解決済

1回答

3605閲覧

コンソール画面の表示・非表示の方法について

nto

総合スコア1438

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

1グッド

0クリップ

投稿2020/09/17 13:11

特定の処理を開始した場合にコンソール画面を出現させたい

pywなどの拡張子による表示・非表示の切り替えではなく
通常時は非表示の状態で特定の処理を実行した際に
プログラム内で表示を切り替える方法などはあるのでしょうか?

参考

以下のソフトは動画のコンバーターソフトですが
通常起動時はコンソール画面の表示などはなく
コンバートを開始する事でコンソール画面が表示され
進捗状況が確認できる仕様になっています。
参考:handbrake

teamikl👍を押しています

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

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

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

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

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

guest

回答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
teamikl

総合スコア8760

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

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

nto

2020/09/18 07:39

わざわざ書いてもらって恐縮です。 Cは全くわからないので私にはGetConsoleWindowに至れませんでした。 またThreadPoolExecutorも初見でしたが非常に便利ですね! 毎度非常に勉強になります。此度はありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問