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

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

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

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

Tkinter

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

Q&A

解決済

1回答

2278閲覧

Python tkinter フォルダダイアログが起動しない

goki_gottan

総合スコア168

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2020/01/12 01:47

Python3のtkinterを使用しています。

1スクリプトファイル実行時では、フォルダダイアログのボタンを押しても、
毎回、ちゃんと起動しますが、スクリプトファイルが複数連携したファイルで、
その中のフォルダダイアログがある1ファイルを実行した際、
フォルダダイアログが開くボタンを押してもダイアログが開かず、
永遠に実行中の表示がされたままになる不具合について。。

省力も含め、以下コード

import tkinter,tkinter.filedialog, def callback1(event): fld1 = tkinter.filedialog.askdirectory(initialdir = dir) EditBox1_.delete(0,tkinter.END) EditBox1_.insert(0,fld1) return"break" Static1_ = tkinter.Label(root,text=u'FBA出品者上限数', width=18,height=1,font=('Helvetica', '11',"bold"),foreground='#000000', background='#ffaacc') Static1_.place(x=50, y=105) #エントリー EditBox1_ = tkinter.Entry(root,width=10,font=('Helvetica', '11',"bold"),) EditBox1_.insert(tkinter.END,r"") EditBox1_.place(x=240, y=105) Button1_ = tkinter.Button(root4,text=u'OK', width=10,height=2,font=('Helvetica', '11',"bold"),foreground='#000000', background='#ffaacc') Button1_.bind("<Button-1>",callback1) Button1_.place(x=390, y=380)

単独スクリプトファイルの場合は、上記で動きます。
複数ファイルの場合も、同じコードです。

Spyderを実行しております。
おもしろいことに、一度、単独スクリプトファイルを実行し、フォルダダイアログを開いた後、
閉じ、その後、複数ファイルが連携したファイルを実行し、フォルダダイアログを開くと、ちゃんと開きます。

これって、どこが悪いのでしょうか?
心当たりある、知見がある方はご教示いただけないでしょうか。

宜しくお願いします。

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

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

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

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

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

shiracamus

2020/01/12 02:04 編集

> スクリプトファイルが複数連携したファイルで、 その連携状態を示していただかないと分からないと思います。 それぞれで Tk() を生成しているとか、それぞれで mainloop を呼んでいるとか。
goki_gottan

2020/01/12 06:29

それぞれにTk()を設けております。mainloopも設けております。ファイルダイアログ(ファイルを選択)は正常に動作します。フォルダダイアログのみ異常なようです。 その他、必要な情報はお伝えします。
shiracamus

2020/01/12 06:38

必要最小限まで削ぎ落した各ソースコードを見てみないと、なんとも言えません。
goki_gottan

2020/01/12 08:04

かなり長いですが・・・ mainのファイルがあり、tkで起動し、ボタンを押すことで、次のファイルが実行されます。 その際、import ファイルを事前に実行しております。 それぞれのファイル名には、def test()というコードを設け、これによりimportファイルを事前に実行していても実行されないようにし、関数にしております。 def test()関数以下は、tkが実行されており、rootをそれぞれ別名にし、管理しております。
goki_gottan

2020/01/12 08:09

もし、よろしければコードを全てお見せしますが、ここでは厳しいかもです。 ちなみに、subprocessは実行しておりません。 複数といっても、2,3個のファイル数でしたらちゃんと実行できておりましたが、5個以上になってからフォルダダイアログがおかしいという感じです。 OSError: [WinError -2147417850] スレッド モードを設定してから変更することはできません。 このようなエラーも出たりします
shiracamus

2020/01/12 10:13 編集

全部を見せる必要はないです。 必要最小限の行だけを抜き出してテスト用コードを作り、デバッグするといいです。 イベント処理途中に別のmainloopを呼んでて画面描画が止まってたとか、オブジェクトを変数に代入してなくて破棄されてたとかもよくあるバグです。
goki_gottan

2020/01/12 13:34

すみません、テスト用コードをつくり、どこで見せるのでしょうか? ここでするのでしょうか?
goki_gottan

2020/01/12 13:39

ちなみに、単独ファイルを実行し、一度、フォルダダイアログが正常に起動できたのを確認後、他のファイル(複数連携ファイル)を起動し、フォルダダイアログを実行してみるとちゃんと動く理由が分からないです。 フォルダダイアログは起こりやすいのですか?
shiracamus

2020/01/12 14:36

どんな処理を実行しているのかまったくわからないので、回答できません。 質問欄のコードを実行しようとしてもエラーになります。 正しく動かないというコードをこちらでも動作確認できるように不要な処理を削って、質問欄に貼っていただけますか?
goki_gottan

2020/01/12 14:43

ここですね、わかりました。長くなりますけど
goki_gottan

2020/01/12 16:44

すみません、簡略化している間に、もしかしたら解決したかもしれません。 import pywinauto をあるファイルに入れているのですが、 これの位置を、ファイルの最初ではなく、関数の中に入れると無事動作しました。 なんとも説明しづらいのですが、import pywinauto これってフォルダダイアログとなんか悪影響を与えるようなことって考えられます? 実際に、 import pywinauto import ・・・・ def test() ・・・・ という構文ではなく、 def test() import pywinauto とすると、うまく他のファイルも含めてフォルダダイアログを開くことができるようになりました。
goki_gottan

2020/01/12 16:55

なにか書いていただけますとベストアンサーにいたします。 import pywinautoが悪さしているようですが、そのへんの知見をご教示いただけますと幸いです。
shiracamus

2020/01/12 17:39

> def test() > import pywinauto そう書くと、test() で呼び出すまで import が実行されません。 test() を実行していないなら、import pywinauto を書かなかったのと同じです。
goki_gottan

2020/01/13 10:31

ありがとうございます。おっしゃる通りです。 まず、mainファイルに、各ファイルを連携させるため、importファイルを書きますよね? その際、そのimport ファイルのときに、連携ファイルを読みにいくと思うのですが、 あるファイルには最初にimport pywinautoを書いておりました。 そこで、pywinautoが悪さしており、その後のファイル実行時にフォルダダイアログを開けないというエラーが発生していたのではないでしょうか? pywinautoは、フォルダを自動で選択させるように、フォルダダイアログを開き、自動で選択というプログラムを入れております(ただし、実行しない場合はそこまで動作しないはずです) 話を最初にもどします。 import ファイルを書き、tkinterでGUIを呼び出し、ボタンを押すと、各ファイルのdef test()関数を実行するようにしております。
goki_gottan

2020/01/13 10:36

それか、ボタンを押すと、importファイルを実行し、その後、関数へ飛ばすという構成にするのが正なのかもしれません。 OKボタンを押す。callback2としましょう。 def callback1(event):  ファイル.test() ではなく、 def callback1(event):  import ファイル  ファイル.test() とすると、 そのimportするファイルの最初に、import pywinsutoを書くことができると思います。 なんにせよ、pywinautoが悪さしていることには変わりありません。 他のライブラリーは悪さしておりませんから。
shiracamus

2020/01/14 00:33 編集

私にはpywinautoの知見がないのでなんとも言えませんが、import直後にprintでメッセージ出力してみて、import処理から復帰しているか確認してみます。 復帰してくるなら、復帰後の関数定義とクラス定義直前にprintを書いて、どこまでimport処理が進むのか確認してみます。 復帰してこないなら、pywinauto内部で使うモジュールと同じ名前のファイルがローカルにないか確認してみます。
goki_gottan

2020/01/14 15:43

pywinauto内部のモジュールが怪しいというご意見、誠にありがとうございます。 おっしゃる通り、そのモジュール内部の重複は疑わしいですね? 確認いたします。ベストアンサーにしたいです
guest

回答1

0

ベストアンサー

どこまで処理が進んで止まるのか、printデバッグ行を入れなら徐々に処理を削って、原因を特定するといいです。

投稿2020/01/14 15:48

shiracamus

総合スコア5406

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問