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

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

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

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

Python

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

Q&A

解決済

1回答

4584閲覧

filedialog.asksaveasfilename(ファイルダイアログの名前を付けて保存の文)について

skysoul

総合スコア111

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2020/05/09 03:23

質問

エラーメッセージが出るわけではないんですが、
どういうわけか、関数の中で

filedialog.asksaveasfilename文

を入れると、関数を実行させなくてもfiledialog.asksaveasfilenameが暴発してしまいます

該当のソースコード

python3.8.3rc1

1def btn_save_click(uwagaki) : 2 if uwagaki == 0: 3 typ = [('text file','*.txt')] 4 dir = 'C:/Users' 5 fle = filedialog.asksaveasfilename(initialdir = dir,title = "Save as",filetypes = [("text file","*.txt")])

(必要のない部分は省略しています)

試したこと

関数の外に出したらうまくいきました
引数をなくすとうまくいきました(この場合変数を参照するとエラーメッセージが出ます)

補足情報(FW/ツールのバージョンなど)

使用ソフト:python3.8.3rc1 shell

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

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

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

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

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

coco_bauer

2020/05/09 03:41

「関数を実行させなくてもfiledialog.asksaveasfilenameが暴発」というのは、どういう現象なのでしょうか? "btn_save_click"という関数名から、関数の実行ではなく、ボタンのクリックによって起動される関数のように思われるのですが。
teamikl

2020/05/09 04:07 編集

問題原因を探すために、必要な部分のコードも省略されてしまってるので、 「実際に動かせ」「他人が現象を確認できる」コードの掲載を お願いします。 長い場合は、 質問用に必要最低限な短いコードを作ってみてください。 上記コードから不明な点: - tkinter だとは思いますが、それも明記されていません。 - btn_save_click関数とボタンをどのように結びつけたのか tkinter のボタンでは command か bind で関数を登録しますが、 これらの場合、通常では引数であるuwagaki に数値が渡ることはありません。 よって、btn_save_click関数が意図せず呼ばれたとしても、 if uwagaki == 0: 自体が通ることが考えにくいです。 ※追記: lambda 等を用いて意図的に引数を渡す場合は数値有りえますが その場合、上記コードからは解らないので、情報不足です。 (ここでよくある間違いでは、登録時に関数を呼んでしまっているケース) - 何か他のライブラリのボタンと組み合わせて使おうとされてませんか?
skysoul

2020/05/10 01:56

import tkinter from tkinter import filedialog import os # 画面作成 tki = tkinter.Tk() tki.geometry('500x300') tki.title('とぅりす') # 空リスト作成 todo = [''] * 11 todo_hyouji = [''] * 11 # 上書き判定初期化 uwa = 0 # ラベル def ref(): lbl_1 = tkinter.Label(text='①          ') lbl_1.place(x=30, y=70) lbl_2 = tkinter.Label(text='②          ') lbl_2.place(x=30, y=100) lbl_3 = tkinter.Label(text='③          ') lbl_3.place(x=30, y=130) lbl_4 = tkinter.Label(text='④          ') lbl_4.place(x=30, y=160) lbl_5 = tkinter.Label(text='⑤          ') lbl_5.place(x=30, y=190) lbl_6 = tkinter.Label(text='⑥          ') lbl_6.place(x=230, y=70) lbl_7 = tkinter.Label(text='⑦          ') lbl_7.place(x=230, y=100) lbl_8 = tkinter.Label(text='⑧          ') lbl_8.place(x=230, y=130) lbl_9 = tkinter.Label(text='⑨          ') lbl_9.place(x=230, y=160) lbl_10 = tkinter.Label(text='⑩          ') lbl_10.place(x=230, y=190) lbl_1 = tkinter.Label(text='①'+todo_hyouji[0]) lbl_1.place(x=30, y=70) lbl_2 = tkinter.Label(text='②'+todo_hyouji[1]) lbl_2.place(x=30, y=100) lbl_3 = tkinter.Label(text='③'+todo_hyouji[2]) lbl_3.place(x=30, y=130) lbl_4 = tkinter.Label(text='④'+todo_hyouji[3]) lbl_4.place(x=30, y=160) lbl_5 = tkinter.Label(text='⑤'+todo_hyouji[4]) lbl_5.place(x=30, y=190) lbl_6 = tkinter.Label(text='⑥'+todo_hyouji[5]) lbl_6.place(x=230, y=70) lbl_7 = tkinter.Label(text='⑦'+todo_hyouji[6]) lbl_7.place(x=230, y=100) lbl_8 = tkinter.Label(text='⑧'+todo_hyouji[7]) lbl_8.place(x=230, y=130) lbl_9 = tkinter.Label(text='⑨'+todo_hyouji[8]) lbl_9.place(x=230, y=160) lbl_10 = tkinter.Label(text='⑩'+todo_hyouji[9]) lbl_10.place(x=230, y=190) # リセット・更新 def refresh(): for i in range(10): if todo[i] == '': todo_hyouji[i] = '[追加]' else: todo_hyouji[i] = todo[i] ref() # ボタン関数10個 def btn1_click(): del todo[0] refresh() todo.append('') def btn2_click(): del todo[1] refresh() todo.append('') def btn3_click(): del todo[2] refresh() todo.append('') def btn4_click(): del todo[3] refresh() todo.append('') def btn5_click(): del todo[4] refresh() todo.append('') def btn6_click(): del todo[5] refresh() todo.append('') def btn7_click(): del todo[6] refresh() todo.append('') def btn8_click(): del todo[7] refresh() todo.append('') def btn9_click(): del todo[8] refresh() todo.append('') def btn10_click(): del todo[9] refresh() todo.append('') # セーブ関数 def btn_save_click(uwagaki) : if uwagaki == 0: typ = [('text file','*.txt')] dir = 'C:/Users' fle = filedialog.asksaveasfilename(initialdir = dir,title = "Save as",filetypes = [("text file","*.txt")]) # 書き込み with open(fle, 'w') as f: for d in todo: f.write("%s\n" % d) uwa = 1 else: f = open(fle,'w') f.write(todo) f.close() # btn_load_click def btn_load_click(): typ = [('text file','*.txt')] dir = 'C:/Users' fle = filedialog.askopenfilename(filetypes = typ, initialdir = dir) with open(path) as f: todo = f.readlines() uwa = 1 # 初期化 refresh() # btn_add_click def btn_add_click(): if "" in todo: new = todo.index('') todo[new] = txt_1.get() refresh() # DONEボタン btn1 = tkinter.Button(tki, text='DONE', command=btn1_click) btn1.place(x=180, y=70) btn2 = tkinter.Button(tki, text='DONE', command=btn2_click) btn2.place(x=180, y=100) btn3 = tkinter.Button(tki, text='DONE', command=btn3_click) btn3.place(x=180, y=130) btn4 = tkinter.Button(tki, text='DONE', command=btn4_click) btn4.place(x=180, y=160) btn5 = tkinter.Button(tki, text='DONE', command=btn5_click) btn5.place(x=180, y=190) btn6 = tkinter.Button(tki, text='DONE', command=btn6_click) btn6.place(x=380, y=70) btn7 = tkinter.Button(tki, text='DONE', command=btn7_click) btn7.place(x=380, y=100) btn8 = tkinter.Button(tki, text='DONE', command=btn8_click) btn8.place(x=380, y=130) btn9 = tkinter.Button(tki, text='DONE', command=btn9_click) btn9.place(x=380, y=160) btn10 = tkinter.Button(tki, text='DONE', command=btn10_click) btn10.place(x=380, y=190) # テキストボックス txt_1 = tkinter.Entry(width=20) txt_1.place(x=70, y=250) # 追加ボタン btn_add = tkinter.Button(tki, text='追加', command=btn_add_click) btn_add.place(x=200, y=250) # セーブ+ボタン btn_save = tkinter.Button(tki, text='SAVE', command=lambda:btn_save_click(uwa)) btn_save.place(x=380, y=250) # ロード+ボタン btn_load = tkinter.Button(tki, text='LOAD', command=btn_load_click) btn_load.place(x=420, y=250) これがフルです。あえて少し省略するならば import tkinter from tkinter import filedialog import os # 画面作成 tki = tkinter.Tk() tki.geometry('500x300') tki.title('とぅりす') # 空リスト作成 todo = [''] * 11 todo_hyouji = [''] * 11 # 上書き判定初期化 uwa = 0 # ラベル def ref(): lbl_1 = tkinter.Label(text='①          ') lbl_1.place(x=30, y=70) lbl_1 = tkinter.Label(text='①'+todo_hyouji[0]) lbl_1.place(x=30, y=70) # リセット・更新 def refresh(): for i in range(10): if todo[i] == '': todo_hyouji[i] = '[追加]' else: todo_hyouji[i] = todo[i] ref() # ボタン関数10個 def btn1_click(): del todo[0] refresh() todo.append('') # セーブ関数 def btn_save_click(uwagaki) : if uwagaki == 0: typ = [('text file','*.txt')] dir = 'C:/Users' fle = filedialog.asksaveasfilename(initialdir = dir,title = "Save as",filetypes = [("text file","*.txt")]) # 書き込み with open(fle, 'w') as f: for d in todo: f.write("%s\n" % d) uwa = 1 else: f = open(fle,'w') f.write(todo) f.close() # btn_load_click def btn_load_click(): typ = [('text file','*.txt')] dir = 'C:/Users' fle = filedialog.askopenfilename(filetypes = typ, initialdir = dir) with open(path) as f: todo = f.readlines() uwa = 1 # 初期化 refresh() # btn_add_click def btn_add_click(): if "" in todo: new = todo.index('') todo[new] = txt_1.get() refresh() # DONEボタン btn1 = tkinter.Button(tki, text='DONE', command=btn1_click) btn1.place(x=180, y=70) # テキストボックス txt_1 = tkinter.Entry(width=20) txt_1.place(x=70, y=250) # 追加ボタン btn_add = tkinter.Button(tki, text='追加', command=btn_add_click) btn_add.place(x=200, y=250) # セーブ+ボタン btn_save = tkinter.Button(tki, text='SAVE', command=lambda:btn_save_click(uwa)) btn_save.place(x=380, y=250) # ロード+ボタン btn_load = tkinter.Button(tki, text='LOAD', command=btn_load_click) btn_load.place(x=420, y=250)
guest

回答1

0

ベストアンサー

推測になりますが、意図的に問題を再現するとしたらこのような感じでしょうか。

「ボタンを押したときに呼ばれる関数を渡す」はずが、
その関数自体を呼んでしまっている事がよくあるので、
該当しないか確認して見て下さい。


問題があるケース。command=btn_save_click(0) の時点で呼んでしまっている。

python

1import tkinter as tk 2from tkinter import filedialog 3 4def btn_save_click(uwagaki): 5 if uwagaki == 0: 6 typ = [('text file','*.txt')] 7 dir = 'C:/Users' 8 fle = filedialog.asksaveasfilename(initialdir = dir,title = "Save as",filetypes = [("text file","*.txt")]) 9 10root = tk.Tk() 11button = tk.Button(root, text="Save", command=btn_save_click(0)) 12button.pack() 13root.mainloop()

期待する動作をするコード。ボタンクリック時にbtn_save_click()関数が呼ばれる

python

1import tkinter as tk 2from tkinter import filedialog 3 4def btn_save_click(uwagaki): 5 if uwagaki == 0: 6 typ = [('text file','*.txt')] 7 dir = 'C:/Users' 8 fle = filedialog.asksaveasfilename(initialdir = dir,title = "Save as",filetypes = [("text file","*.txt")]) 9 10root = tk.Tk() 11button = tk.Button(root, text="Save", command=lambda:btn_save_click(0)) 12button.pack() 13root.mainloop()

投稿2020/05/09 04:19

teamikl

総合スコア8760

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

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

skysoul

2020/05/10 01:53

lambda:を付けたらうまくいきました。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問