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

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

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

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

Q&A

解決済

1回答

905閲覧

python3 別スクリプト終了後の動作について

goki_gottan

総合スコア168

Python 3.x

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

0グッド

0クリップ

投稿2019/10/05 10:51

編集2019/10/06 01:51

別スクリプトを動作させた後、mainに戻るのですが、
その際に、文字を表示させたいです。

def callback2(event): 別スクリプト() print("aaaaa") return"break"

上のように、ボタン2を押すと、callback2がイベントされます。
その際、別スクリプトが動くのですが、その別スクリプトを閉じた際に、
print("aaaa")
がでるようにしたいのですが、でません。

メインのスクリプトを閉じた際に出ます。
ちなみに、メインではtkinterを使用しており、そのボタン2を押すと上記別スクリプトが起動します。別スクリプトを閉じても[aaaa]は表示されず、メインを閉じると[aaaa]が出るようです。

これを、別スクリプトが閉じたら、[aaaa]と表示という風に、mainスクリプトに指示したく思います。
どのようにしたら出せますでしょうか?

追記----------------------------------

import tkinter as tk import tkinter.ttk as ttk import sys,os import system_1 def main(): root1 = tk.Tk() root1.title(u"ログイン") root1.geometry("600x200") def callback1(event): if event.widget["state"] == "disabled": return"break" else: event.widget["state"] = "disabled" Button2.config(state="disabled") system_1.test() print("aaaaa") event.widget["state"] = "active" Button2.config(state="active") return"break" def callback2(event): root1.destroy() main() Button1 = tk.Button(root1,text=u'設定', width=15,height=2,font=('Helvetica', '11',"bold"),foreground='#000000', background='#ffaacc') Button1.bind("<Button-1>",callback1) Button1.place(x=345, y=25) Button2 = tk.Button(root1,text=u'戻る', width=15,height=2,font=('Helvetica', '11',"bold"),foreground='#000000', background='#ffaacc') Button2.bind("<Button-1>",callback2) Button2.place(x=345, y=125) root1.mainloop() main()

別ファイル

import tkinter as tk import tkinter.ttk as ttk import pandas as pd typ = [('csvファイル','*.csv')] dir = 'C:\' def test(): root = tk.Tk() root.title(u"Web") root.geometry("800x500") #検索文字1----------------------------------------------------------------- Static1 = tk.Label(root,text=u'保存先フォルダ', font=('Helvetica', '11',"bold"),width=18,height=1, foreground='#000000', background='#ffaacc') Static1.place(x=50, y=65) #エントリー EditBox1 = tk.Entry(root,width=50,font=('Helvetica', '11',"bold"),) EditBox1.insert(tk.END,r"") EditBox1.place(x=240, y=65) def callback1(event): root.destroy() def callback2(event): root.destroy() #OKボタン Button1_ = tk.Button(root,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) #キャンセルボタン--------------------------------------------------------------------------------------------------- Button2_ = tk.Button(root,text=u'Cancel', width=10,height=2,font=('Helvetica', '11',"bold"),foreground='#000000', background='#ffaacc') Button2_.bind("<Button-1>",callback2) Button2_.place(x=555, y=380) root.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

フラッシュしたらどうなりますか?

pythonで print の出力結果を即時表示, 強制表示, フラッシュさせる(主にjupyter)

追記

Python

1import tkinter 2import sys 3import subprocess 4 5def callback(event): 6 subprocess.run("dir", shell=True) 7 print("aaaaa") 8 return "break" 9 10root = tkinter.Tk() 11button = tkinter.Button(text='クリックしてください') 12button.bind("<Button-1>", callback) 13button.pack() 14root.mainloop()

追記

こちらでは表示されないどころかエラーが出ます。
ウィンドウを二つ作りたい場合には tkinter を二重に作成するのではなく、Toplevel を使ってください。

「Tkinter」Toplevelでサブウィンドウを作成(Python)

追記

もしかしたらこちらの方が参考になるかもしれません。

Tkinter で新しいウィンドウ/ダイアログを生成する

投稿2019/10/05 11:04

編集2019/10/06 02:39
Zuishin

総合スコア28660

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

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

goki_gottan

2019/10/05 16:48

ダメでした。メインのtkinterを切るとprintされます。それ以外は何も受け付けず、プロセスとしてどうなっているのでしょうか? 待機状態となっているのでしょうか?
goki_gottan

2019/10/05 16:49

むしろ、メインに別スクリプトが閉じたときに実行する関数ってあったりするんでしょうか?
Zuishin

2019/10/05 22:12 編集

Python を起動したターミナルのことであれば、待機状態になっていると思います。バックグラウンドで起動すれば表示されるかもしれません。
goki_gottan

2019/10/05 23:37

spyderを使用しております。これが原因ということでしょうか? ちなみに、printではなく、違う構文を使用しても同様にメインを閉じたら実行するようです。 バックグラウンドで起動するってどうゆうことでしょうか?
Zuishin

2019/10/05 23:42

何というシェルですか?
Zuishin

2019/10/05 23:52

よく見ると nohup で実行した場合、出力は nohup.out に入ってしまうようなので、コンソールに出ません。nohup を使わず python main.py & のように最後に & を付けて実行してみてください。
goki_gottan

2019/10/05 23:56

それは、コマンドプロンプロトで実行するということでしょうか?
goki_gottan

2019/10/05 23:56

ちなみに、Win10を使用しております。
Zuishin

2019/10/06 00:28

テスト用スクリプトを追記しました。私の環境では、このスクリプトを実行すると、ボタンを押すたびに dir が実行され、その直後 aaaaa が表示されます。 これを実行するとどうなりますか?
Zuishin

2019/10/06 00:28

言い忘れましたが、バックグラウンド処理は忘れて、そのまま普通に実行してください。
goki_gottan

2019/10/06 00:42

追記ありがとうございます。dirのところを、別スクリプトを呼び出す構文にしてみましたが、ダメでした。 subprocess.run(〇〇.test(), shell=True) #〇〇.testは別スクリプトの関数
Zuishin

2019/10/06 00:43

dir でどうなりますか? 「ダメ」ではなく、どうなるのかを書いてください。
goki_gottan

2019/10/06 00:44

別スクリプトでは、〇〇.pyは、tkinterを使用しており、多重tkinterのGUIを連動させております。 これが原因だったりしますか? dirではなく、他のスクリプト構文を実行できますでしょうか?
Zuishin

2019/10/06 00:47

トラブルシューティングの基本は問題の切り分けです。一目散に目的地に向かっても失敗します。可能性を少しずつ排除していって、最後に残った可能性から原因を探ります。 ここでは、スクリプトのどちらに原因があるのかを探っています。 「ダメ」では何の可能性も排除できないので、「どうなるのか」また「それは目的に沿うものなのか」「そうでないとすればどうなってほしいのか」を詳しく誤解の無い表現で書いてください。
goki_gottan

2019/10/06 00:47

dirだと、普通にaaaが出力されます
Zuishin

2019/10/06 00:52 編集

では、この部分に問題はないということです。問題は「〇〇test()」です。多重 tkinter はすこぶる怪しいですが、他に手掛かりが無いのではどうにもなりません。問題の再現する最小のコードを作って質問に追記してください。
goki_gottan

2019/10/06 00:51

ありがとうございます。 それでは、別スクリプトを実行する際に、〇〇.test()を使用します。 そのスクリプト内にtkinterを使用し、多重しております。 これが誤動作しているのでしょうか? 解決策ありませんか?
Zuishin

2019/10/06 00:52

コメントを編集している間に入れ違いましたが、問題の再現する最小のコードを作って質問に追記してください。
goki_gottan

2019/10/06 01:10

別スクリプトは、 def test(): root = tk.Tk() root.title(u"〇〇") root.geometry("800x500") とし、ボタンやエディットボックスがあります。
goki_gottan

2019/10/06 01:11

こちらは構文自体にミスはないと思います。
goki_gottan

2019/10/06 01:13

続いて、メインのコードは、 def main(): root1 = tk.Tk() root1.title(u"ログイン") root1.geometry("600x200") こちらも、tkinterを使用しております。ボタンを押せば、 def callback3(event): if event.widget["state"] == "disabled": return"break" else: event.widget["state"] = "disabled" Button3.config(state="disabled") subprocess.run(〇〇.test(), shell=True) event.widget["state"] = "active" Button3.config(state="active") return"break" という処理へ行きます。ちなみに、別ファイルは実行されます
Zuishin

2019/10/06 01:23 編集

別スクリプトについて、「実行可能」で「問題の再現する」「最小」のものを「作って」「質問に追記」してください。
Zuishin

2019/10/06 01:24

その際、呼び出すのは私の回答に追記したコードとします。
Zuishin

2019/10/06 01:25

subprocess.run は外部コマンドを実行するものなので、関数であればこれは使わず、import して普通に呼び出してください。
goki_gottan

2019/10/06 01:29

importしております。 呼び出すのは私の回答に追記したコードとします。とは、 subprocess.run("dir", shell=True) これを使えということですか?
Zuishin

2019/10/06 01:30

subprocess.run は外部コマンドを実行するものなので、関数であればこれは使わないでください。test() なら test() と書いてください。
Zuishin

2019/10/06 01:32

私の回答に追記したコードというのは、あなたのところにある本番のコードに組み込まれると、こちらでは確認できないので、コードを共有しようということです。 こちらも新しく作ってもらっても構いませんが、こちらで実際に動作確認のできるものにしてください。
Zuishin

2019/10/06 02:32

回答に追記しました。やはり二重に作成しているのが良くないようです。
goki_gottan

2019/10/06 02:44

やはり、toplevelしかいないんですかね・・・。 それでは、tkinterのtreeviewを使えないですね。 困りましたね。
goki_gottan

2019/10/06 02:53

やってみました。たしかにできましたね。 ウインドウ生成までは、toplevelを使うしかないのですね。 そのあとのボタンでは複雑なコードになりますので、 そのコードは別スクリプトで処理するようにしますね。 あくまで、フレーム、ウインドウは多重してはいけないのですね。 コードを書き替えるようにします。ありがとうございました。
Zuishin

2019/10/06 02:57

フレーム、ウィンドウは Toplevel で作れるので、それは複数作っても構いません。 Tk() を複数回行って destroy してはいけないということです。 これはウィンドウを作るだけではなく、別のこともしています。
goki_gottan

2019/10/06 03:04

うーん、しかし、他のところで、別スクリプトでtk使ってますが、閉じても次の工程へ進みますけど・・・ ボタンを押すbindが何か悪さしてるのでしょうか。 tkinter多重ってのが悪いのでしょうかね。
Zuishin

2019/10/06 03:10

気になるならソースを見てください。だめなものは実際だめなので、あとは理由だけです。それはソースに書いてあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問