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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2551閲覧

Python: 開発時(デバッグ実行時)に検出されるエラーの解析方法を 効率化したい

saya24

総合スコア247

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2020/05/14 01:28

編集2020/05/16 11:03

現在自分が行っている開発がTkInterのライブラリを利用していること、と
開発環境は人それぞれであること、を理由に若干回答はつきにくい可能性がありますが、これからの開発作業を考慮し、恥を忍んでお聞きします。
画面イメージを生成できない時

Python

1btn2 = Button(self.dialog, width=10, image="images\excel.png", command=outCsv) 2btn2.grid(row=5, column=9, pady=10)

今回、モーダル側のボタンイメージを変更する質素な変更を加えたのですが(これはこれで謎...)、こういったエラーの表示のされ方しかなされません。
もう少し、具体的にエラー内容・問題箇所を示すようなことは不可能でしょうか?

現在は エラーの発生箇所の特定を行いやすいよう、少しコーディングを終えては こまめにデバッグ実行を繰り返す措置を行っています。
VisualStudioの問題でしょうか? 

何かの設定が足りないがため 他人様より開発がしづらい環境で作業を行っていないか?と 少々気になりましたので 問い合わせさせて頂きました。

2020/05/14 21;54 追加

イメージ説明

2020/05/15 16:35 追加

たとえば ありえないURLへアクセスするrequest文を含むプログラムでも、動作の異常検知はapp.mainloop()の部分

Python

1from tkinter import * 2import tkinter.ttk as ttk 3import tkinter.messagebox as tkMB 4import tkinter.scrolledtext as tksc 5import math 6import requests 7 8 9 10class Apprication(ttk.Frame): 11 12 def __init__(self, app): 13 super().__init__(app) 14 self.pack() 15 16 btn = ttk.Button(self, text="Sub", command=self.openDialog) 17 btn.grid(row=1, column=0) 18 19 20 21 # 子画面開く 22 def openDialog(self): 23 24 self.dialog = Toplevel(self) 25 self.dialog.title("Sub Menu") 26 27 #フォームサイズを実行端末から導き、ド真中に配置表示 28 lw = math.ceil(ww * 0.408) 29 lh = math.ceil(wh * 0.477) 30 self.dialog.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2)) ) 31 32 self.dialog.configure(bg="#F0FFFF") 33 self.dialog.resizable(0,0) 34 self.dialog.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 35 36 # 当該ダイアログのカーソルを変更し、関数側でもカーソルを変更できるように 37 self.dialog['cursor'] = 'hand2' 38 self.this = self.dialog 39 40 # modalに 41 self.dialog.grab_set() 42 43 44 45 # ★WebAPIアクセスボタン★ 46 btn1 = Button(self.dialog, text='Execute', width=10, command=self.webAPI) 47 btn1.grid(row=2, columnspan=11, pady=(0, 20)) 48 49 # 閉じるボタン 50 btn3 = Button(self.dialog, text='Quit', command=self.closeDialog, width=10) 51 btn3.grid(row=5, column=10, pady=10, padx=(0,10)) 52 53 54 self.dialog.grid_rowconfigure(1, weight=1) 55 self.dialog.grid_rowconfigure(3, weight=1) 56 self.dialog.grid_columnconfigure(2, weight=1) 57 58 59 60 61 # 子画面閉じる 62 def closeDialog(self): 63 self.dialog.destroy() 64 65 # WebAPIアクセス 66 def webAPI(self): 67 self.this['cursor'] = 'watch' 68 self.update() #画面更新 69 70 param = {"data1": 9, "data2": "hoge"} 71 r = requests.post("http://99.99.99.99/hoge/test01.php", data=param) 72 if (r.status_code == 200): 73 tkMB.showinfo("Result","Finished !", parent=self.this) 74 else: 75 tkMB.showwarning("Result", "[" + str(r.status_code) + "] error occured !", parent=self.this) 76 77 self.this['cursor'] = 'hand2' 78 79 80 81 82if __name__ == '__main__': 83 84 #世間でいうrootをappとしています 85 app = Tk() 86 87 #実行端末の画面サイズを取得 88 ww = app.winfo_screenwidth() 89 wh = app.winfo_screenheight() 90 91 app.update_idletasks() 92 93 #フォームサイズを実行端末から導き、ド真中に配置表示 94 lw = math.ceil(ww * 0.208) 95 lh = math.ceil(wh * 0.277) 96 app.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2)) ) 97 98 #タイトルを指定 99 app.title("Main Menu") 100 101 #フォームの最大化、×ボタン操作を無効化 102 app.resizable(0,0) 103 #app.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 104 105 # カーソル変更 106 app["cursor"] = "hand2" 107 108 app.configure(bg="#F0FFFF") 109 110 # フレームを作成する 111 frame = Apprication(app) 112 # 格納したTkインスタンスのmainloopで画面を起こす 113 app.mainloop() 114

2020/05/15 23:12追加

windowアプリケーションではない位置づけにすると、出力ウィンドウやコンソールにエラー内容が表示される(コードは反転してくれません)
イメージ説明

2020/05/16 20:05追加

VisualStudio上でプロジェクトをWindowsアプリケーションと位置付ける・位置付けない
これ

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

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

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

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

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

quickquip

2020/05/14 02:28

貼られている画像と貼られているコードの関係はなんでしょう? (同一ファイルの別部分? 別ファイル? などなど)
saya24

2020/05/14 03:13

貼り付けたコードは この部分を変更したことによって、貼り付けた画像のエラーが生じるようになった、という関係を示しました。 提示のコード2行をコメントアウトすればエラーはでなくなります。 今回の問い合わせ主旨は デバッグ実行時 【このコード部分が反転する】など 問題部分をアピールするようなことはないのか?? 貼りつけた画像レベルのSyntaxエラーでは、問題部分を自ら探し出さなければならないわけだが 皆さんが そういった状況での開なのか を確認したかったのです。 分かりづらい質問ですみません
quickquip

2020/05/14 04:02 編集

貼り付けたコードを追加すると画像の警告が出るが、コメントアウトすると警告は消えるということで合っていますか? なぜ警告が出るのかは理解できているのでしょうか? 警告がでるのが妥当な挙動なのか、妥当でない挙動なのかという、肝心な部分が分かってません。 結局、同一ファイルの別部分なのでしょうか? 別ファイルなのでしょうか? タイトルのSyntaxエラーというのが何の話なのかもわかりません。どこかにSyntax Errorがでていますか? それとも添付画像に書いてある内容をSyntaxエラーと呼んでいますか? (この画像は"意味論的な警告"であって"形式論的な文法エラー"ではないですよね? という感想なので)
quickquip

2020/05/14 03:37

貼ってあるコードに self. という部分が見えるのでこのコードはトップレベルに書いているものじゃないですよね。コードを全部書いた方がよくありませんか?
saya24

2020/05/14 04:13

quiquiさん ご見解をありがとうございます。 >結局、同一ファイルの別部分なのでしょうか? 別ファイルなのでしょうか? 同一ファイルです。 >それとも添付画像に書いてある内容をSyntaxエラーと呼んでいますか? 画像をSyntaxエラーと呼んでいます。デバッグ実行時に発覚するので実行時エラーと呼ぶべきですか? 問合せ主旨はエラーを解決したいわけではなく、エラー箇所の特定は 皆さん自身が行うほかないのか?を聞きたかったので、コードの貼り付けが抜粋となってしまっているのです。すみません
quickquip

2020/05/14 05:17

まず文法的なエラーではないのでSyntaxエラーと呼ぶのは間違いです。 実行時にエラーが出るなら実行時エラーですが、実行時にエラーが出ないなら実行時エラーではありません。 実行前に "エラーが出る余地がある" 箇所が警告になっています。 ですが、プログラマが "エラーが出ないと確信できる" なら無視していいわけです。 (エラーが出ないと確信していて「警告を消す方法」を聞かれているならまだ納得します) 今の状態は「警告が出る理由があなた以外の誰にも分からないコード」があって、それを踏まえて「エラー箇所の特定をどうするればいいか?」という質問になっています。
quickquip

2020/05/14 05:20

↑と書きましたが、本当に実行時例外な気もしてきました……。 最後の段落以外無視していただいてよいかも……。
teamikl

2020/05/14 07:09

「Syntax エラー」ではなく、 タイトルは単純に「エラーの解析方法を」で良いと思います。 > エラー箇所の特定は 皆さん自身が行うほかないのか? 通常であれば何処かに詳細なトレースバックが出力されます。 (どの関数から呼ばれてきたか、ファイル名や行数等の詳細情報) Visual Studio の場合、上記の画面であれば「詳細のコピー」で クリップボード内にコピーされるようです。
saya24

2020/05/14 07:22

teamiklさん 毎日お世話になります。標題をこの後に変えます。 取りあえず<https://python.keicode.com/advanced/tkinter-widget-button.php>を参考にして、ボタンに採用するイメージの適用の仕方が根本的に間違っていることに気が付きました。(image=パスじゃだめみたい) widgetを生成できない時のエラーって、皆さんの開発環境ではもっと 親切な表示がなされるのですかね??
teamikl

2020/05/14 08:45

Button の image では上記画像の様なエラーにならないので 別件でしょうか? 実行してなかったので解りませんでしたが、 一応、Pythonで一時変数(PhotoImage)をたくさん作りたくない場合、 image引数にファイルパスを通す運用方法もあったりします。 ==== エラーは、大抵の環境ではエディタ上で該当位置を示してくれます。 - 「例外設定」で Python Exceptions にチェックが入ってますか? - 実行時コンソール画面、出力にエラーは表示されてませんか
saya24

2020/05/14 09:04 編集

>- 「例外設定」で Python Exceptions にチェックが入ってますか? 入れていません。もちろん試しに入れて実行した経験もあります。ダイアログが現れ一時停止するのではなく 動作が強制終了する感じになりましたね。 >- 実行時コンソール画面、出力にエラーは表示されてませんか コンソールはWindowsアプリケーションを選択しているからか現れていません。(VSでは当該プロジェクトがWindowsアプリケーションか否かの選択があります) 出力ウィンドウにはエラー発生時 いくつかのコメントは現れてきます。しかし画面に現れるダイアログとそう変わらない内容で私にとっては役に立ちません。仰られた「詳細のコピー操作」でクリップボードに貼りつく内容と全く同じ内容が現れてくるだけのことです。 ('NoneType' object has no attribute 'write' スタック トレース: > File "C:\Users\XXXXXX\source\repos\PA_1\PA_1\module6.py", line 280, in <module> > app.mainloop() '__main__' を読み込みました ) ですって...
teamikl

2020/05/14 09:38

実行時のエラーに関しては、 そのスタックトレースを読み解いてエラー原因を探します。 module6.py の 280行目 Noneオブジェクトの 存在しないwrite属性を参照しようとしてエラー 何のオブジェクトのwrite属性を参照しようとしているのか そのオブジェクトは何処から渡されてきたのかを辿り、 Noneになっていないかどうかを調べます。特に代入のタイミング。 複数の関数を経由する場合はスタックトレースにその経路が現れます。 デバッガーで実行すれば変数を監視して表示してくれる機能もあるはずです。 参考: VisualStudio - Python コードのデバッグ https://docs.microsoft.com/ja-jp/visualstudio/python/debugging-python-in-visual-studio?view=vs-2019
saya24

2020/05/14 10:57 編集

280行目が スクリーンショットで提示している app.mainloop()ですからねぇ.... 今回の例は ダイアログ側に配置したボタンのimage属性の設定方法に問題があったわけですが、この問題点が 今までに登場している情報だけで推察できるかと言われれば 正直難しいように思いました。慣れていれば そもそも画面設計部分で エラーを起こすことなどないので 皆さんは困らないのかもしれませんねぇ.... そろそろ終わりにします
teamikl

2020/05/14 12:24

- Button の imageの設定方法が違う場合、TclError になるはずだけど、 提示のエラーは None オブジェクトのwrite属性へのアクセスです <-- 提示されたコードにwrite 等がないので不可解な部分 - app.mainloop() の行は最終的に例外が到達した時点ですが、 スタックトレースを辿れば例外の発生元は特定可能です。 <-- 提示されたエラーログが省略されてないのなら ここは認識の異なるポイント 可能性としては、デバッグ実行して例外が発生した後にコードの実行を進めてしまい、 必要なスタックトレースの全貌が得られていなかった等が考えられますが、 同じ状況の再現ができないとなんとも言えません。 この場合、コンソールで(デバッガではなく)通常実行したなら完全なエラーログが得られる可能性はあります。
saya24

2020/05/14 13:01 編集

今、自宅で社内のWebサーバにつなげない状況下で例のPythonのプログラム(WebAPIにrequestでアクセス)を実行してみたのですが、やはり280行目のapp.mainloopの部分でエラーになったかのように止まりました。 行単位のステップ実行を今しがた試して分かったのですが、requestを実行して 一定時間を経過したらapp.mainloopの部分までスっとんでいく動作をしています。 これは....仰られるように「例外が発生した後にコードの実行を進めてしまい、」という状況になっているのかもしれませんねぇ。勿論私は何もしていませんが。 本文に今から一つの画像を貼り付けますが、例外設定の部分で どこかにチェックを入れないといけないのかな????全体でチェックしてしまうと 動作が強制終了してしまうようですが
teamikl

2020/05/14 14:34

少しだけ光明が見えたかな?VisualStudio は普段使っていない為、 設定に詳しいわけではないのでその点ご了承ください。 > 動作が強制終了してしまうようです 現象がわからないので、まずはここを確認させてください 1. 応答がありません・・・みたいなダイアログが出て終了しますか? 2. ウィンドウが操作を受け付けない状態のことを指していますか? 3. 強制的にmainloopを抜けて、プロセスの実行が終了ということでしょうか? (確認点) Tkinter等のGUIプログラムでは、 イベントループ(tkinterではmainloop)がウィンドウの描画やマウス操作等の処理を受け持っていて 例外等により中断された状態ではGUIは操作を受け付けないのが正常な動作です。 関数の実行が終わり処理がmainloopに戻ったときにGUI操作も再開できるようになります。 これ以外で本当にメモリアクセス違反みたいな強制終了だとしたらわかりませんが もし、強制終了が 2. の状況を指している場合は全部チェックしても良いと思います。 他の問題があり絞り込む必要がある場合は、**今回の**画像のエラーの場合は、 AttributeError 例外が投げられているはずです。(対話環境で確認) >>> x = None >>> x.write Trace back (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'write'
saya24

2020/05/15 00:09 編集

お付き合いを頂き誠にありがとうございます。 現在は敢えて繋がらないWebAPIに接続する環境・プログラムをデバッグ実行してみて reqestの行部分で一時停止するのではなく、app.mainloop()の行部分で一時停止してしまうことについてなぜか考えている認識で良いですかね?? なんでもかんでもapp.mainloopの部分で画面に訴えられては(当初のスクショ)、問題特定の効率が悪いというのが焦点で。まずは認識の共有化から > 動作が強制終了してしまうようです 2ですね。コードをありえないURLにした上、モーダルウィンドウ上のWebAPIアクセスのためのコマンドボタンを押下すると、突如 当案件に掲載した当初のスクリーンショット画面で一時停止する事態を招きます。 ちなみに本文に追加した画像:PythonExceptionsの最上位のチェックボックスにチェックを付けて、コマンドボタンを押下すると 先に伝えてとおり 完全にデバッグ自体が終了し 出力画面には「プログラム 'pythonw.exe' はコード 0 (0x0) で終了しました。」というコメントが現れます。 チェックボックスを付けていないときは 先に伝えたとおり 「'NoneType' object has no attribute 'write' スタック トレース:  > File "C:\Users\XXXXXX\source\repos\PA_1\PA_1\module6.py", line 280, in <module> > app.mainloop()  '__main__' を読み込みました」です。 デバッグは中断し、モーダルウィンドウが画面に現れ続けています。 モーダルウィンドウ側のエラーは 必ず app.mainloop()で画面に訴えられる、ということでしょうかねぇ?? VisualStudioでなくてもそうであるならば もう致し方ないことと 諦めがつくのですが。 長時間に亘り 申し訳ありません。
teamikl

2020/05/15 06:27

>なんでもかんでも app.mainloop・・まずは認識の共有化から ここは把握できました。質問における要点の部分ですよね。 - 動機、現状報告されるエラーはどれも同じ個所を示していて役に立たない - 目的としては、エラーの大元の原因となる箇所を表示したい - 不明な点、例外時のコード中断が意図しない箇所まで(勝手に?)進められている >> 動作が強制終了してしまうようです > 2ですね。 2. であれば、私の認識ではこれはデバッガで動作時の正常な動作です。 意図された動作ではないかもしれませんが、 イベントループが止まった時にGUIが停止するのは正常です。 逆に動いていると、デバッガのコード中断が正常に機能していない事になります。 デバッガの使い方に関しては幾つか懸念になるポイントはありそうです。 関数やカーソル位置まで実行や、ブレイクポイントが意図しない所に設定されていないか等、 改善案としては => 適切にブレークポイントを設定する、ステップ実行する等。 > モーダルウィンドウ側のエラーは 必ず app.mainloop()で画面に訴えられる、 > ということでしょうかねぇ?? 最終的にmainloopが報告されるのは、 Tkinterのプログラムであればコードの構造上そうなってるので、どの環境でも同じです。 この点は区別したうえで 今回の問題点では、スタックトレースに含まれるべき 必要な情報(例外の発生元の情報)が得られていないことにあります。 通常であれば、「エラーの発生元の情報が一番上にあり」「最後にmainloop」といった感じです。 前者の括弧が今回の相違点。後者は環境は関係なく、コードの構造上共通の部分です。 この問題については、コードの問題なのか環境や設定の問題なのか、 現時点で提示されてる情報だけでは解り兼ねます。 例えば「モーダルウィンドウ側」とありますが、私の視点からは 提示されている情報だけでは全容を把握できないからです。 そこで、回答の方の私のコメントを読んで頂ければ思うのですが、 具体的なコード(断片ではなく、実行できて問題が再現できるもの)が提示されないと、 明確にこれが原因と断言できるものがなく、手探りで色々推測するだけのような状態になってしまいます。 具体的なコードがあれば、開発環境の問題なのか、デバッガの使い方の問題なのか、 少なくともコード側に問題がないのかどうかは区別できると思います。 現状の問題のあるコードではない方がよいです、 例えば、新規に単純にボタンを押すと関数を呼び出すプログラムを作り funcA() -> funcB() -> funcC() と呼び出し、funcC()で意図的にエラーを起こし 例外の情報に funcC の情報が含まれるかどうかを試すだけでも、問題解決に近づけます。 問題が再現するなら環境・設定・デバッガの使い方の問題 再現しないなら、実行時の設定かコードの他の箇所の問題と、問題領域が絞り込めます。 > VisualStudioでなくてもそうであるならば・・・ 実際の所、開発環境の問題とは考え難いのですが、 これに関しては時間のある時に色々な開発環境を試してもいいと思いますよ。 開発環境の問題かどうかははっきりします。 他に回避策としては、(恐らく)デバッガが意図しない動作をしてるようなので、 一手間増えますが、普通にコンソールで実行してエラー箇所の辺りを付けてから、 ブレークポイントを設定してVisualStudioから実行みたいな方法はどうでしょう。 ==== こちらこそ、すいません。少し進展合ったかなと思い続けてしまいましたが、 最後に大雑把にまとめてみますね。 デバッガの使い方等は時間かかると思うので、ご自分のペースで読み進めてください。 - 開発環境の問題 ... VisualStudio特有の問題・設定等があれば解りませんが、 - デバッガの問題 ... 設定や使い方次第では、今回の問題のような症状を起こしそう - コードの問題 ... ここは問題が再現できるコードが提示されないと情報不足で解りません
saya24

2020/05/15 06:53

事象(app.mainloop()で画面に報告される)シンプルなコードを作って、提示するようにします。 少々お時間を頂きます、少々お待ちください。
saya24

2020/05/15 07:49

今しがた 簡易なコードを本文に追加しました。 ありえないURLのAPIへアクセスするコードですが、requestの部分で動作が保留されるわけでなく add.mainloop()の部分で 動作が保留されます。 今回のケース同様、例えばダイアログ側のボタンにイメージを適用した際に、設定の仕方を間違えたとしても 動作が保留されるのは app.mainloop()であり 問題部分の検出に苦労している というのが 当方の悩みです。ステップ実行すれば良いのかもしれませんが
teamikl

2020/05/15 08:44

取り急ぎ、実行してみたので報告を。画像があるので後で回答の方に追記しますね。 vs2019/win10/anaconda py3.7.4上の仮想環境 で、mainloop()迄進む現象は確認できず、 「例外設定」のチェックの有無にかかわらず、挙動は違えど期待通りのエラーが得られました。 開発環境はアップデートしたばかりで設定は一切してません、Python環境のみの最小インストールです。 詰めてない箇所(相違点)は、 - Pythonのバージョン(3.8の時に注意文が出たため) - 実行時にコンソールが表示されるモードで起動
saya24

2020/05/16 09:57 編集

実行時にコンソールが表示されるモードとは、プロジェクトをWindowsアプリケーションの位置づけではないものと定義づけて デバッグ実行することを指していますよね。teamiklさんの検証は Windowsアプリケーションとしての位置付けで行った、ということですかね?? 私はどちらにしても、期待の結果を得ませんでした(回答側に記載しましたが) VS2017 ProでPython開発されている方がおりましたら、設定をお聞きしたいですね。それ以前同じ事象を招くも気にせず開発を進めてしまう方もいるかも知れませんが。 やっぱり今のままの開発作業は 効率が悪くなるだろうししっかり対策を整えるか、別のIDEに手を出すか 考えなきゃな〜って........
teamikl

2020/05/16 10:48

>teamiklさんの検証は Windowsアプリケーションとしての位置付けで行った、ということですかね?? ここは、Visual Studio の設定自体よくわからないのですが、 「プロジェクトをWindowsアプリケーションの位置づけではないものと定義づけて」 <-- こちらです 「Windowsアプリケーションとしての位置付けで行った」<-- これは設定方法がわかりません 「インストール直後で何も設定していない状態」です。「実行時にコンソールが表示される」は、 Tkinter の GUI と一緒にコンソールも現れて、終了時に何かキーを~ということを聞かれます。 唯一触った設定が「例外設定」のPython Exceptions です、 私の場合は、ここにチェックしないと例外時に実行が中断されませんでした。 画像をキャプチャしたものは プロジェクトも作っていなかったと思います、ファイルを単体で開いて実行しました。 一応プロジェクトを作っても試していて同じ動作を確認しています。
teamikl

2020/05/16 10:56

>やっぱり今のままの開発作業は 効率が悪くなるだろうししっかり対策を整えるか、別のIDEに手を出すか 考えなきゃな〜って........ 古い環境で一度だけ似たような現象を再現出来ましたが、 確かに役に立たない状況ですよね。 Visual Studio 側の公式フォーラムにも、デバッガの挙動で類似しそうな状況が幾つか有りましたが、 大抵は対応したからアップデートしてという対策で終わってました。 VisualStudio 側の問題化設定なのかに関わらず、 正確なエラーが得られないのは現在直面してる問題なので、 まずは他の手段を模索した方が良いですよね。 IDEの場合は対象環境(tkinter)のデバッグがサポートされてないと、 問題が起こるが情報が少ないとなることがあるかもしれないで、その辺りは注意です。
saya24

2020/05/16 11:11

長期に亘りましてありがとうございました。再現するまでお手を煩わせてしまい本当に申し訳ありませんでした。解決できたのならまだしも、時間を費やして頂きながら...ほんと気分は晴れませんよね、すみません。万能ではない、ということで諦めますね。本文に一応 VisualStudio上でプロジェクトをWindowsアプリケーションか否か切り替えられる部分の画像を追加致しました。
teamikl

2020/05/16 12:23

>(コードは反転してくれません) 部分レスになりますが、エラーメッセージを選択してコピーが出来ないという事であれば、対処法3つ - コマンドプロンプトのテキストをコピーする方法   - タイトルバーを右クリックし プロパティ内にある「テキスト行の選択を有効にする」を選択する   - CtrlキーやAltキーを押しながら範囲選択、Ctrl-Cでコピー - ファイルに出力する方法があります。IDEで手軽に設定で出来るか解りませんが コマンドラインから実行する場合は「windows 標準エラー リダイレクト」辺りを検索 https://support.microsoft.com/ja-jp/help/110930/redirecting-error-messages-from-command-prompt-stderr-stdout 実行するコマンドの末尾に 2> で「標準エラー」をファイルにリダイレクトします。 - デバッグ時のコードに仕込む方法。(プロダクション環境には反映されないように注意) import sys; sys.stderr = open("error.log", "a", encoding="utf-8") sys.stdout や sys.stderr にファイルオブジェクトを設定すると、 出力先をコンソール画面からファイル等に変更できます。 ちなみに、私の場合ここは例外設定の Python Exceptions にチェックを入れれば IDE 内の出力画面に出力されました。(普通の操作でコピー可能です)
guest

回答1

0

ベストアンサー

開発環境に関して
Visual Studio は解らないので、開発環境についての質問になりますが、

  • 画像左下に有る「詳細のコピー」でクリップボードにエラー内容はコピーされませんか?
  • また、「例外設定」により設定を変更できる箇所はないでしょうか?
  • 通常の出力画面にエラーが表示されてませんか?
  • Pythonファイルの拡張子を .py ではなく .pyw にしてませんか?

該当のエラーに関して

変更した部分で直接エラーがでるのではなく、
変更により間接的に他の部分の整合性が崩れた場合等では、
エラーメッセージが問題の特定箇所を示さないことはあります。

この場合は、問題が再現できる必要最低限のコードが提示されないと、
問題個所の絞り込みは難しいです。
(問題の原因が提示されたコード外に有る為)

質問用に、「他の人がコピーし実行して同じ問題が再現できる」
というのを一つの基準に、新規にコードを書いてみてください。

提示されたコードを動かす為に修正が必要だと、
その暗黙の変更部分の違いで問題が起こったり起こらなかったり
する事も有るので、前提条件の違いにより、すれ違いが起こりやすくなります。
(実は~~だったみたいな、後から条件が出てくる状況)

※ 問題の特定にあたり、実行可能な完全コードは必要ですが、とは言え
規模の大きなコードをそのまま全部コピーでは「丸投げ」みたいになってしまい
このサイトの趣旨上、あまり印象が良くない様です。その辺は適切に。
出来れば、問題の再現に焦点を絞ったコードの作成をお勧めします。


2020/05/15 18:00 追記

画像があるためこちらに追記します。

気になった点。Pythonのバージョンについて
3.8を選択した時に以下の注意文が出てきました。詳細

イメージ説明

画像は「例外設定」で Python Exceptions にすべてチェック時のモノ。
チェックを外すとエディタ上での行を示してくれませんでしたが、
「出力」タブにて必要なエラーは全て得られました。

以上から、コードの問題ではないことはひとまず確認。

例外箇所がエディタ上に補足されなかったのは、
例外設定にチェックが入っていなかった事だと推測されます、が

mainloopで止る原因と、他のエラーの詳細がなくなっている事については不明なままです。
他に考えられる原因は、

  • pythonのバージョン
  • 実行時の環境設定、等

他に験せる事があるとすれば、実行環境の設定を改める為に
プロジェクト/ソリューションを作り直し、新しい実行環境で同じコードをテスト、等。

イメージ説明

※ オフトピ: リクエスト用のテストに使うアドレスは、
ローカルアドレスの存在しないポート等でもよかったですね。
他に、こういったテストの場合に使えるものがあります。(実際に繋がるわけではありません)
例示/実験用として利用できるドメイン名

投稿2020/05/14 04:42

編集2020/05/15 09:15
teamikl

総合スコア8760

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

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

saya24

2020/05/15 14:05

わざわざ検証までご対応頂きありがとうございます。やはり自分の開発環境が正常ではないようですね??teamiklさんが画像で示して頂いたように動作が保留されるのであれば私は大満足ですが、私の環境はそうなっていません。ほかに試せることのご提案を頂きましたので 一応別プロジェクトを作って、自分が提示した同コードを試行してみました。 ちなみに 遅ればせながら自分の開発環境はVS2017Professinal:Pythonは64bit版も32bit版も3.6がセットアップされています。 話題にしていたプロジェクトは64bitのインタプリタを利用してデバッグされるようになっていました。 で、別プロジェクトでのデバッグ実行の結果は...同じですね。app.mainloop()までいって動作保留になるか、例外設定のメニュでPythonException最上位にチェックを付けた上でのデバッグ実行では Python.exeまでも終了してしまう、という事象です。 一つだけ改めて分かったことは 当該プロジェクトをWindowsアプリケーションではない位置づけで定義づけた上でデバッグ実行すると(今まではWindowsアプリケーションの位置づけ)、 出力ウィンドウにrequestの部分で問題が生じている詳細のエラー内容が現われること・問題のコード部分が反転してくれるまでしないものの、app.mainloop()まで勝手にスッ飛ぶようなことはなくなること(ダイアログのウィンドウ操作を継続して操作が可能:Quitボタンを押せる)が分かりました。 もはやPythonの問題を通り越しておりますね、すみません。多分PythonのVerの問題でもないような気がしますね。意図した動きにならない可能性がある、とのメッセージは自分の端末でも今までに見たことがあるような気がします。 teratailで「NoneType' object has no attribute ~」で検索すると結構多くの方が問合せをしているようでした。本来検出されるべきエラー部分で動作が保留されないがために悩まされた方、以外に多い可能性もあるんじゃないでしょうか いづれにしても設定漏れの発見か、適用パッチが出回っていないようであれば 私はこのIDE、Pythonにおいてはやめたほうが良いかも知れませんね
teamikl

2020/05/16 10:41

>teratailで「NoneType' object has no attribute ~」で検索すると結構多くの方が問合せをしているようでした。本来検出されるべきエラー部分で動作が保留されないがために これは、VisualStudio の問題とは切り分けて考えた方が良いです。 NoneType~は、他の言語では NullPointerExceptionといって エラーの中で最も多いものと統計が出てたりします。 このエラーが出ること自体は特に珍しいものではありません。 (何でもこのエラーになってしまうというなら、認識していた状況と違うので前提から変わってきます) そして、設定漏れや環境側の原因以外に、デバッガの使い方も 例えば、現在行迄実行みたいなことをしてないか等。確認項目は幾つもありますが、 具体的にこれかなと思い当たるものは今の所ありません。 Pythonのバージョンよりは、VisualStudio のバージョンか コンソールとWindowsアプリケーションの違いが一番解決に近そうですね。 追試で、古い環境にあった vs2015 で試してみましたが 「必ずmainloopでエラーが報告される」不可解な現象が確認出来ました。問題の深追いはしてませんが、 自分でコードを書いて試すと今度は発生しなかったりとよくわからない状況です。 (※初期にインストールしたままでアップデートもしてない環境です) 原因を絞り込むのが難しそうであれば、IDEを変えてみるのも手でしょう。 一応、運用では別の方法(VisualStudioを介さず実行する)等でも回避できます 一手間掛かってしまいますが、正確なエラーを得られていない状況なので まずはこれの解消を最優先ですね。 参考になるか解りませんが、自分は普段はIDEを使ってないので デバッガを使ったステップ実行は普段は使ってません。 デバッガは詳細なエラーを得たい時・実行を止めて変数を監視したりする必要がある時に使ってます。 普段のエラーは端末に出力されるエラーで十分なことが多いです。
saya24

2020/05/16 11:19

色々とありがとうございました。本件クローズ致します。 >これは、VisualStudio の問題とは切り分けて考えた方が良いです。 自分の被害者意識から、みんなが巻き込まれているんじゃないの?、みたいな気持ちにどうしてもなってしまったのです。 IDEの変更を本格的に検討します、今後の開発の上で 他人様と開発過程の話題でつじつまが合わないことになったりしかねませんから。 当記事の掲載当初:再現されるまでは 一体何を言っているのだろう?と思われたかもしれませんね。 本当に色々と手をつくして頂きありがとうございました。
teamikl

2020/05/16 11:59

そうですね、初見ではButton のコードと画像のエラーの関連がわからずでしたが、 質問の趣旨が、という所で把握できました。 エラーに関しては、肝心の原因となっている箇所の情報がない状態だと、 推測に頼らざるを得なくなります。 質問時のエラー等は省略せずに書くことが推奨されてますが、 省略せずに得られたエラーのすべてがこれだけしかないのでは、確かにつじつまが合いませんよね。 雑感になりますが、私もこういう事例があるんだと知れたのと 実際に試してみて、バージョン違いでの挙動の違いが確認出来た等、参考になりました。 「Windowsアプリケーション」の設定は、余談として 後で(後日にでも)試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問