Как создать средство выбора файлов с помощью Tkinter?

Я пытался создать средство выбора файлов с помощью Tkinter. Я хочу, чтобы это произошло при нажатии кнопки "выбрать файл". Проблема, однако, заключается в том, что он автоматически открывается вместо открытия графического интерфейса, а затем создает окно каталога файлов после нажатия кнопки. Я не правильно его создаю?

#Creates the Top button/label to select the file
this.l5 = Label(this.root,text = "Boxes File:").grid(row = 0, column = 0)
this.filename = StringVar()
this.e3 = Entry(this.root,textvariable = this.filename)
this.button3 = Button(this.root,text = "Select File",command=filedialog.askopenfilename()).grid(row = 0, column = 7)
mainloop()

person Shan    schedule 18.06.2015    source источник
comment
Не ставьте () после askopenfilename.   -  person TigerhawkT3    schedule 19.06.2015
comment
Кроме того, не связывайте .grid(), иначе вы сохраните None в this.button3. Кроме того, я рекомендую придерживаться стандартного self вместо использования this.   -  person TigerhawkT3    schedule 19.06.2015
comment
Ладно, вроде поправил. Спасибо!   -  person Shan    schedule 19.06.2015


Ответы (2)


  1. Технически это не требуется, но вы должны использовать стандартный self вместо this.
  2. Что-то вроде a = Button(root).grid() сохраняет результат grid() в a, так что теперь a будет указывать на None. Сначала создайте и назначьте виджет, затем вызовите диспетчер геометрии (grid() и т. д.) в отдельном операторе.
  3. command виджета — это функция, которую виджет будет вызывать по запросу. Допустим, мы определили def search_for_foo(): .... Теперь search_for_foo — это функция. search_for_foo() — это то, что search_for_foo запрограммировано на return. Это может быть число, строка или любой другой объект. Это может быть даже класс, тип или функция. Однако в этом случае вы просто использовали бы обычный command=filedialog.askopenfilename. Если вам нужно передать аргумент функции обратного вызова виджета, есть способы сделать это.
person TigerhawkT3    schedule 18.06.2015

Измените атрибут команды button3. Это сработало для меня.

#Creates the Top button/label to select the file
this.l5 = Label(this.root,text = "Boxes File:").grid(row = 0, column = 0)
this.filename = StringVar()
this.e3 = Entry(this.root,textvariable = this.filename)
# Insert "lambda:" before the function
this.button3 = Button(this.root,text = "Select 
File",command=lambda:filedialog.askopenfilename()).grid(row = 0, column = 7)
mainloop()
person Eshita Shukla    schedule 30.11.2017