1

私は Tkinter をいじっていますが、次々と入力を求めている間に機能します。「askopenfilename」のように。しかし、多くのポップアップを取得するのはそれほど快適ではありません. 一度にすべての入力を取得するフレームを 1 つだけ作成したいと思います。

そして、これまでのところ、FileNameまたはDirectoryを尋ねるボタン付きのフレーム(いくつかのチュートリアルから)だけが見つかりましたが、ユーザーの選択を読み取ることができません。

import Tkinter, Tkconstants, tkFileDialog
class TkFileDialogExample(Tkinter.Frame):

  def __init__(self, root):
    Tkinter.Frame.__init__(self, root)

    # define buttons
    Tkinter.Button(self, text='askopenfilename', command=self.askopenfilename).pack()
    Tkinter.Button(self, text='askdirectory', command=self.askdirectory).pack()

  def askopenfilename(self):
    return tkFileDialog.askopenfilename()

  def askdirectory(self):
    return tkFileDialog.askdirectory()

if __name__=='__main__':
    root = Tkinter.Tk()
    TkFileDialogExample(root).pack()
    root.mainloop()

そして、それは私が大丈夫なフレームを構築するだけですが、ノンストップでループし、ユーザーが選択したものを取得できません。ボタンの関数(リターンであるため)に付属する値を簡単に取得できるのではないかと思いましたか?

ここで提案されているように、関数の値を格納するために空のリスト、配列、ディックを作成する必要がありますか: Returning a value after calling a function with a button in Tkinter、まだ試していません...

または、「ボタンから」読み取るだけの他の方法はありますか?

4

1 に答える 1

2

multipleまず、フラグ forを使用して、ユーザーが 1 つのダイアログで複数のファイルを選択できるようにしますtkFileDialog

次に、tkFileDialogファイル名 (または複数のファイル名を含む文字列) を返し、必要に応じてそれを処理できます。例えば:

def askopenfilename(self):
    files = tkFileDialog.askopenfilename(multiple=True)
    # files might be "file1.txt file2.exe file3.bmp" at this point
    if files: # make sure user didn't cancel the dialog, selecting nothing
        for f in files.split(' '):
            print f

選択したファイルを別の方法で使用する場合は、ファイル名をインスタンス変数に保存するか、直接渡します。ボタンによって呼び出され、そのような戻り値をどう処理するかわからないため、ここでは return の使用はあまり役に立ちません。

以下のアプローチでは、ファイルでやりたいことを何でもするためにprocessFiles使用できます。self.files

def askopenfilename(self):
    self.files = tkFileDialog.askopenfilename(multiple=True)
    self.processFiles()
    # alternatively:
    files = tkFileDialog.askopenfilename(multiple=True)
    self.processFiles(files)

その他の例については、こちらを参照してください。

于 2012-11-20T10:38:29.240 に答える