Python tkinter: используйте одну кнопку для выбора текстового файла, а другую - для открытия и чтения содержимого в строку - PullRequest
0 голосов
/ 01 ноября 2018

Я работаю над программой, которая позволяет пользователю выбрать файл одной кнопкой:

    def select_file(self):
            filename = tkinter.filedialog.askopenfilename(initialdir=".")
            infile = open(filename, "r")

и другая кнопка, помеченная как количество вхождений, должна прочитать текстовый файл в строку для поиска того, что ввел пользователь:

def count_occurrences(self):
    user_file = open(infile, "r")
    txt_file = user_file.read()

   # (omitted the code for counting occurrences for the sake of relevance)

Я не уверен, в какой функции заключается проблема или в обоих.

После нажатия кнопки «Выбрать файл» имя метки отображается в метке, но когда я нажимаю кнопку «Количество вхождений» после ввода текста поиска, я получаю сообщение об ошибке:

"user_file = open (filename," r ") FileNotFoundError: [Errno 2] Нет такого файла или каталога: ''

Любая помощь будет оценена, спасибо!

1 Ответ

0 голосов
/ 01 ноября 2018

Я не уверен, каков код вашего проекта, но ее решение:

from tkinter import *
from tkinter import ttk, filedialog
#import io

class ReadFileApp:

    def __init__(self, master):

        self.label = ttk.Label(master, text = "How Read a File Content!")
        self.label.grid(row = 0, column = 0, columnspan = 2)

        ttk.Button(master, text = "Open File",
                   command = self.select_file).grid(row = 2, column = 0)

        ttk.Button(master, text = "Print the Content",
                   command = self.count_occurrences).grid(row = 2, column = 1)    

    def select_file(self):
            filename = filedialog.askopenfilename(initialdir=".")
            self.infile = open(filename, "r")
            #self.infile = io.TextIOWrapper(self.infile, encoding='utf8', newline='')
            print(self.infile.name)

    def count_occurrences(self):
        with open(self.infile.name, 'r') as myfile:
            txt_file=myfile.read().replace('\n', '')
        print(txt_file)

def main():              
    main = Tk()
    app = ReadFileApp(main)
    main.mainloop()

if __name__ == "__main__": main()

этот код должен прекрасно работать.

ваша проблема была: 1. локальная переменная infile не видна другим функциям 2. функция filedialog возвращает тип io.TextWrapper, поэтому вам нужно получить путь в виде строки, вызвав infile.name

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...