Относительно вашего вопроса
Как подсказывает Бумкин, я бы посоветовал переместить строку input_txt = open(location, ...)
в вашу функцию search
. Таким образом, программа будет пытаться открыться с location
только после того, как вы нажали кнопку и определили location
.
Если есть что-то еще, вы можете сделать другую функцию и вызвать ее:
def file_handling(location):
input_txt = open(location, "r", encoding="utf8")
... #anything using input_txt
def search():
root.filename = filedialog.askopenfilename(initialdir="/", title="Select A File",
filetypes=(("txt files", "*.txt"), ("All Files", "*.*")))
file_handling(root.filename)
open_button = Button(root, text="Open File", command=search)
open_button.pack()
...
root.mainloop()
Проблема в том, что объекты Tkinter ничего не делают, пока вы не достигнете mainl oop - но как только вы окажетесь в mainl oop, вы не сможете go назад и заполните все. Итак, все, что вы хотите сделать, должно быть привязано к некоторому типу ввода: например, к нажатию кнопки (или нажатию клавиши, или наведению курсора).
В этом случае вы хотите установить location
, но вам нужно подождать, пока вы не вызовете mainl oop и кнопка не начнет вводить данные. Но к тому времени вы прошли линию, которая нуждается в location
и не может go назад. Вот почему я предлагаю вызывать строку input_txt
из функции search
- потому что она не будет вызываться до тех пор, пока вы не получите местоположение.
Это немного скучно, но я надеюсь, это осветило проблему.
В качестве идентификатора
Я бы также рекомендовал вам объявлять и упаковывать свои виджеты отдельно. То есть, измените это:
open_button = Button(root, text="Open File", command=search).pack()
на следующее:
open_button = Button(root, text="Open File", command=search)
open_button.pack()
В противном случае вы в конечном итоге сохраните значение pack()
(то есть None
) вместо сохранения вашего виджеты (объект Button
).