Использование Tkinter для создания графического интерфейса, который создает папку и разворачивает ZIP-файл.

Здравствуйте, товарищи программисты.

Я пытаюсь сделать графический интерфейс с Tkinter. Я впервые использовал Tkinter и столкнулся с некоторыми проблемами. Сценарий и графический интерфейс должны выполнять следующие действия:

  1. Попросите пользователя (путем ввода и кнопки «ОК») ввести имя рабочей папки. Результат -> Создать вновь созданную папку на рабочем столе системы.
  2. Выберите файл OWL (который является zip-файлом) через TkFileDialog. Результат -> распакуйте выбранный zip-файл в папку, созданную на шаге 1.

Сценарий, который я написал до сих пор, используя онлайн-учебники:

    import Tkinter
    import Tkconstants
    import tkFileDialog
    import zipfile
    from Tkinter import *
    import os

    class TkFileDialogExample(Tkinter.Frame):

      def __init__(self, root):

        Tkinter.Frame.__init__(self, root)

        root.configure(background='lightgrey')
        root.wm_title("Audit tool: Thickness of pavement")
        root.geometry('{}x{}'.format(500, 500))

        Label_1 = Message(root, text="Step 1. Please fill in the name of the output folder and click on 'create'. The output folder will be created in the desktop folder:", width=380,)
        Label_1.grid(row=1, columnspan=5)

        Entry1 = Entry(root)
        Entry1.grid(row=2, sticky=E)

        folder_location = '~/Desktop/' + Entry1.get()

        def createname():

          return os.mkdir(os.path.expanduser(folder_location))

        button_1 = Button(root, text="Create", command=createname)
        button_1.grid(row=2, column =1, sticky=W)

        Label_3 = Message(root, text="Step 2. Please select the OWL file:", width=300,)
        Label_3.grid(row=5, sticky=W)

        button_2 = Button(self, text='Click here to select the OWL file', command=self.askopenfilename)
        button_2.grid(row=4,column=1, sticky=W)

        self.file_opt = options = {}
        options['defaultextension'] = '.owl'
        options['filetypes'] = [('all files', '.*'), ('owl files', '.owl')]
        options['initialdir'] = 'C:\\'
        options['initialfile'] = 'Title_of_OWL-file.ccr'
        options['parent'] = root
        options['title'] = 'This is a title'

        self.dir_opt = options = {}
        options['initialdir'] = 'C:\\'
        options['mustexist'] = False
        options['parent'] = root

      def askopenfile(self):

        return tkFileDialog.askopenfile(mode='r', **self.file_opt)

      def askopenfilename(self):

        filename = tkFileDialog.askopenfilename(**self.file_opt)
        zip_ref = zipfile.ZipFile(filename, 'r')

        if filename:
          return zip_ref.extractall(folder_location)

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

Проблема, вероятно, заключается в третьем использовании «folder_location». Поскольку я относительно новичок в языке Python, я не могу найти решение этой проблемы.

Спасибо за вашу помощь и время!

С уважением,

Рубен ван дер Хейден


person Ruben van der Heijden    schedule 19.03.2016    source источник


Ответы (1)


Проблема в том, что вы определили переменную folder_location только в локальной области действия вашего метода TkFileDialogExample.__init__. В результате он недоступен ни для одного из других методов вашего класса. Если вы действительно хотите, чтобы он был доступен, вам нужно установить его как атрибут вашего класса, используя ключевое слово self.

def __init__(self, root):

    # Stuff

    self.folder_location = os.path.join('~', 'Desktop', Entry1.get())

Затем вы можете получить к нему доступ из своего метода TkFileDialogExample.askopenfilename:

def askopenfilename(self):

    filename = tkFileDialog.askopenfilename(**self.file_opt)
    zip_ref = zipfile.ZipFile(filename, 'r')

    if filename:
      return zip_ref.extractall(self.folder_location)

Примечание. Как правило, лучше всего использовать os.path.join для создания путей к файлам из строк.

person Suever    schedule 19.03.2016