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を実行しております。
おもしろいことに、一度、単独スクリプトファイルを実行し、フォルダダイアログを開いた後、
閉じ、その後、複数ファイルが連携したファイルを実行し、フォルダダイアログを開くと、ちゃんと開きます。
これって、どこが悪いのでしょうか?
心当たりある、知見がある方はご教示いただけないでしょうか。
宜しくお願いします。
> スクリプトファイルが複数連携したファイルで、
その連携状態を示していただかないと分からないと思います。
それぞれで Tk() を生成しているとか、それぞれで mainloop を呼んでいるとか。
それぞれにTk()を設けております。mainloopも設けております。ファイルダイアログ(ファイルを選択)は正常に動作します。フォルダダイアログのみ異常なようです。
その他、必要な情報はお伝えします。
必要最小限まで削ぎ落した各ソースコードを見てみないと、なんとも言えません。
かなり長いですが・・・
mainのファイルがあり、tkで起動し、ボタンを押すことで、次のファイルが実行されます。
その際、import ファイルを事前に実行しております。
それぞれのファイル名には、def test()というコードを設け、これによりimportファイルを事前に実行していても実行されないようにし、関数にしております。
def test()関数以下は、tkが実行されており、rootをそれぞれ別名にし、管理しております。
もし、よろしければコードを全てお見せしますが、ここでは厳しいかもです。
ちなみに、subprocessは実行しておりません。
複数といっても、2,3個のファイル数でしたらちゃんと実行できておりましたが、5個以上になってからフォルダダイアログがおかしいという感じです。
OSError: [WinError -2147417850] スレッド モードを設定してから変更することはできません。
このようなエラーも出たりします
全部を見せる必要はないです。
必要最小限の行だけを抜き出してテスト用コードを作り、デバッグするといいです。
イベント処理途中に別のmainloopを呼んでて画面描画が止まってたとか、オブジェクトを変数に代入してなくて破棄されてたとかもよくあるバグです。
すみません、テスト用コードをつくり、どこで見せるのでしょうか?
ここでするのでしょうか?
ちなみに、単独ファイルを実行し、一度、フォルダダイアログが正常に起動できたのを確認後、他のファイル(複数連携ファイル)を起動し、フォルダダイアログを実行してみるとちゃんと動く理由が分からないです。
フォルダダイアログは起こりやすいのですか?
どんな処理を実行しているのかまったくわからないので、回答できません。
質問欄のコードを実行しようとしてもエラーになります。
正しく動かないというコードをこちらでも動作確認できるように不要な処理を削って、質問欄に貼っていただけますか?
ここですね、わかりました。長くなりますけど
すみません、簡略化している間に、もしかしたら解決したかもしれません。
import pywinauto をあるファイルに入れているのですが、
これの位置を、ファイルの最初ではなく、関数の中に入れると無事動作しました。
なんとも説明しづらいのですが、import pywinauto これってフォルダダイアログとなんか悪影響を与えるようなことって考えられます?
実際に、
import pywinauto
import ・・・・
def test()
・・・・
という構文ではなく、
def test()
import pywinauto
とすると、うまく他のファイルも含めてフォルダダイアログを開くことができるようになりました。
なにか書いていただけますとベストアンサーにいたします。
import pywinautoが悪さしているようですが、そのへんの知見をご教示いただけますと幸いです。
> def test()
> import pywinauto
そう書くと、test() で呼び出すまで import が実行されません。
test() を実行していないなら、import pywinauto を書かなかったのと同じです。
ありがとうございます。おっしゃる通りです。
まず、mainファイルに、各ファイルを連携させるため、importファイルを書きますよね?
その際、そのimport ファイルのときに、連携ファイルを読みにいくと思うのですが、
あるファイルには最初にimport pywinautoを書いておりました。
そこで、pywinautoが悪さしており、その後のファイル実行時にフォルダダイアログを開けないというエラーが発生していたのではないでしょうか?
pywinautoは、フォルダを自動で選択させるように、フォルダダイアログを開き、自動で選択というプログラムを入れております(ただし、実行しない場合はそこまで動作しないはずです)
話を最初にもどします。
import ファイルを書き、tkinterでGUIを呼び出し、ボタンを押すと、各ファイルのdef test()関数を実行するようにしております。
それか、ボタンを押すと、importファイルを実行し、その後、関数へ飛ばすという構成にするのが正なのかもしれません。
OKボタンを押す。callback2としましょう。
def callback1(event):
ファイル.test()
ではなく、
def callback1(event):
import ファイル
ファイル.test()
とすると、
そのimportするファイルの最初に、import pywinsutoを書くことができると思います。
なんにせよ、pywinautoが悪さしていることには変わりありません。
他のライブラリーは悪さしておりませんから。
私にはpywinautoの知見がないのでなんとも言えませんが、import直後にprintでメッセージ出力してみて、import処理から復帰しているか確認してみます。
復帰してくるなら、復帰後の関数定義とクラス定義直前にprintを書いて、どこまでimport処理が進むのか確認してみます。
復帰してこないなら、pywinauto内部で使うモジュールと同じ名前のファイルがローカルにないか確認してみます。
pywinauto内部のモジュールが怪しいというご意見、誠にありがとうございます。
おっしゃる通り、そのモジュール内部の重複は疑わしいですね?
確認いたします。ベストアンサーにしたいです
回答1件
あなたの回答
tips
プレビュー