web-dev-qa-db-ja.com

filedialog、tkinter、およびファイルを開く

Python3でプログラムの[参照]ボタンをコーディングするのは初めてです。私はインターネットとこのサイト、そしてpython標準ライブラリも検索しています。

サンプルコードと物事の非常に表面的な説明を見つけましたが、私が直接抱えている問題に対処するもの、またはニーズに合わせてコードをカスタマイズできる十分な説明を見つけることができませんでした。

関連するスニペットは次のとおりです。

Button(self, text = "Browse", command = self.load_file, width = 10)\
        .grid(row = 1, column = 0, sticky = W) .....


 def load_file(self):

    filename = filedialog.askopenfilename(filetypes = (("Template files", "*.tplate")
                                                         ,("HTML files", "*.html;*.htm")
                                                         ,("All files", "*.*") ))
    if filename: 
        try: 
            self.settings["template"].set(filename)
        except: 
            messagebox.showerror("Open Source File", "Failed to read file \n'%s'"%filename)
            return

この方法は、途中で見つけたいくつかのコードと独自のカスタマイズのハイブリッドです。どうやら必要なわけではありませんが、ようやく機能するようになりました(ちょっと)。

[参照]ボタンを有効にすると、次のエラーが表示されます:NameError: global name 'filedialog' is not defined

私は途中でかなり似た問題を見つけましたが、すべての解決策は私がカバーしたことを示唆しました。 IDLEの「filedialog」ヘルプセクションに入りましたが、そこからも何も収集しませんでした。

誰かがこれについての内訳と少しのガイダンスを提供してくれないでしょうか。私の本は特にそれを扱っておらず、他の人に提供されたすべての解決策をチェックしましたが、私は迷っています。

36
Icsilk

例外は、filedialogが名前空間にないことを伝えることです。 filedialog(およびbtw messagebox)はtkinterモジュールであるため、from tkinter import *だけではインポートされません

>>> from tkinter import *
>>> filedialog
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
NameError: name 'filedialog' is not defined
>>> 

たとえば、次を使用する必要があります。

>>> from tkinter import filedialog
>>> filedialog
<module 'tkinter.filedialog' from 'C:\Python32\lib\tkinter\filedialog.py'>
>>>

または

>>> import tkinter.filedialog as fdialog

または

>>> from tkinter.filedialog import askopenfilename

したがって、これは参照ボタンに役立ちます:

from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter.messagebox import showerror

class MyFrame(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.master.title("Example")
        self.master.rowconfigure(5, weight=1)
        self.master.columnconfigure(5, weight=1)
        self.grid(sticky=W+E+N+S)

        self.button = Button(self, text="Browse", command=self.load_file, width=10)
        self.button.grid(row=1, column=0, sticky=W)

    def load_file(self):
        fname = askopenfilename(filetypes=(("Template files", "*.tplate"),
                                           ("HTML files", "*.html;*.htm"),
                                           ("All files", "*.*") ))
        if fname:
            try:
                print("""here it comes: self.settings["template"].set(fname)""")
            except:                     # <- naked except is a bad idea
                showerror("Open Source File", "Failed to read file\n'%s'" % fname)
            return


if __== "__main__":
    MyFrame().mainloop()

enter image description here

60
joaquin

FileNameに自己プレフィックスを追加し、Buttonの上のメソッドを置き換えてみましたか?自己では、メソッド間で見えるようになります。

...

def load_file(self):
    self.fileName = filedialog.askopenfilename(filetypes = (("Template files", "*.tplate")
                                                     ,("HTML files", "*.html;*.htm")
                                                     ,("All files", "*.*") ))
...
2
NotCamelCase

最初に個々のコマンドを指定してから、*を使用してすべてのコマンドを入力する必要がありました。

from tkinter import filedialog
from tkinter import *
1
James