teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2018/03/15 01:48

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -17,4 +17,52 @@
17
17
 
18
18
  トップレベルウィンドウがいらないのにTk()で生成しているコードをみて「なんだかへんだなぁ」と感じていたのです。
19
19
 
20
- 外してたらスミマセン
20
+ 外してたらスミマセン
21
+
22
+ ---
23
+ 追記:スミマセンやはり外してたようです。
24
+ よくよくやってみるとTcl()としてもダイアログ/メッセージボックスなどの機能を使うとTkのトップウィンドウが出てくるみたいですね。Tcl/Tkで`wm withdraw`(Tkinterでいうところの`root.withdraw()`はトップウィンドウを見せたくないときの普通のマナーなのかも知れません。
25
+
26
+ ダイアログを閉じたとき、トップウィンドウが消えてくれたり消えてくれなかったりするのはtclインタープリタの(内部の?)メインループがまだ動き続けているということではないかと思います。
27
+
28
+ 当方Windows10でAnacondaではない所謂普通の(?)Python 3.6.0なので質問者さんの環境での確認はできてないのですが次のようにしたらどうなるでしょう?
29
+
30
+ リスト2: withdrawがだめならdestroyしてみたらどうか?
31
+ ```python
32
+ import tkinter
33
+ import tkinter.filedialog
34
+
35
+ def fd():
36
+ root = tkinter.Tk()
37
+ root.withdraw()
38
+ foldername = tkinter.filedialog.askdirectory()
39
+ root.destroy()
40
+ return foldername
41
+
42
+ print(fd())
43
+ ```
44
+
45
+ リスト3: tclインタープリタをアプリ終了時に停止する構造にしてみたらどうか
46
+
47
+ ```python
48
+ import tkinter
49
+ import tkinter.filedialog
50
+
51
+ def fd():
52
+ # Tkinterのトップウィンドウの処理はメインに委ね
53
+ # こうした関数ではそれを意識しない
54
+ foldername = tkinter.filedialog.askdirectory()
55
+ return foldername
56
+
57
+ def main():
58
+ # アプリのメイン処理
59
+ # この中からfd()なども呼ぶ
60
+ foldername = fd()
61
+ ...
62
+
63
+ if __name__ == '__main__':
64
+ root = tkinter.Tk()
65
+ root.withdraw()
66
+ main()
67
+ root.quit()
68
+ ```

1

追記

2018/03/15 01:48

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -11,7 +11,7 @@
11
11
  return foldername
12
12
  ```
13
13
 
14
- トップレベルウィンドウが必要ない処理を想定しているなら上記のようにTk()のかわりにTcl()を用いたらどうなるでしょうか。Windows10だとこちらでも動きました。
14
+ トップレベルウィンドウが必要ない処理を想定しているなら上記のようにTk()のかわりにTcl()を用いたらどうなるでしょうか。Windows10(Python 3.6.0)だとこちらでも動きました。
15
15
 
16
16
  トップレベルウィンドウを使わない場合withdraw()とやっているサンプルをよく見る気がしますが、そうせずにTcl()とする方がもしや素直な書き方なのではないかと思いました。
17
17