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

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

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

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

Tkinter

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

Q&A

1回答

1294閲覧

tkinter のファイル選択ダイアログでタスクバーに表示したままルートウィンドウを非表示にしたい

ga3

総合スコア23

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2023/03/19 06:19

編集2023/03/19 15:59

tkinter のファイル選択ダイアログでタスクバーに表示したままルートウィンドウを非表示にしたい

実現したいこと

python でファイル選択ダイアログを表示したいです。

前提

tkinter.filedialog の askopenfilename メソッドでファイル選択のみを行う処理を用意しました。
このとき tkinter が生成する rootウィンドウを非表示にしたいです。
ただ、rootウィンドウを非表示にするとタスクバーからも消えてしまい、ウィンドウを見失った場合に探しにくくなってしまいました。
タスクバーには表示したままでルートウィンドウを非表示にしたいです。

また、常に前面表示とすることで見失うことが無いようにする案もありますが、期待する挙動ではないため採用できません。

該当のソースコード

Python

1import tkinter as tk 2import tkinter.filedialog 3root = tk.Tk() 4root.withdraw() 5file = tk.filedialog.askopenfilename() 6print(file)

試したこと

次のような方針を試しましたが、いずれもうまくいきませんでした。

  • withdraw() で親ウィンドウを非表示にする。

    → タスクバーから消えてしまう。

  • geometry('0x0') と overrideredirect(True)で親ウィンドウを非表示にする。

    → タスクバーから消えてしまう。

  • タスクバーから消えた状態で iconbitmap() によりアイコンを指定する。

    → タスクバーから消えたままアイコンは表示されない。

  • iconify()で親ウィンドウを最小化する。

    → タスクバーでアイコンをクリックすると親ウィンドウが見えてしまう。

  • iconify()で親ウィンドウを最小化し、親ウィンドウのサイズ変更イベントや最小化解除のイベントに対し iconify()で親ウィンドウを最小化する処理を設定する。

    → 親ウィンドウと一緒にファイル選択ダイアログも最小化されてしまう。

  • 親ウィンドウを非表示とし、別に用意したダミーウィンドウを最小化し、ダミーウィンドウの最小化解除のイベントに対し「ダミーウィンドウを最小化する処理と親ウィンドウを前面表示する処理」を設定する。

    → ダミーウィンドウが最小化する前に見えてしまう。また Alt + Tab でダミーウィンドウと親ウィンドウの両方が見えてしまう。

補足情報(FW/ツールのバージョンなど)

実行環境は以下のとおりです。

  • Windows10
  • Python3.8

質問

「試したこと」欄に記載したようにいろいろ試したつもりですが、うまくいきませんでした。
タスクバーに表示したままルートウィンドウを非表示にすることは実現できないのでしょうか?
python ではTcl言語で開発されたTkツールキットを呼び出しているということは知っていますが、python 側でどうにかできる問題ではないのでしょうか?

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

タスクバーに表示したままルートウィンドウを非表示にするには、以下のようにoverrideredirectを使用して、ウィンドウのタイトルバーと枠線を削除し、ウィンドウを最小化します。

import tkinter as tk
import tkinter.filedialog

root = tk.Tk()
root.overrideredirect(True) # タイトルバーと枠線を削除
root.iconify() # ウィンドウを最小化

file = tkinter.filedialog.askopenfilename()
print(file)

root.destroy() # ルートウィンドウを閉じる

この方法で、ウィンドウは最小化されタスクバーに表示されますが、ルートウィンドウは表示されません。
ただし、askopenfilenameメソッドを呼び出すと、ファイル選択ダイアログが表示されます。

投稿2023/03/19 06:33

quiz

総合スコア258

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

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

ga3

2023/03/19 06:59

ご回答ありがとうございます。 試してみたところ、下記のようなエラーが発生しました。 私の環境の問題でしょうか?動作が確認できている環境を教えていただけると幸いです。 Traceback (most recent call last): File "xxx.py", line 6, in <module> root.iconify() # ウィンドウを最小化 File "xxx\Python3.8.9\lib\tkinter\__init__.py", line 2086, in wm_iconify return self.tk.call('wm', 'iconify', self._w) _tkinter.TclError: can't iconify ".": override-redirect flag is set
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問