2017-01-19 3 views
0

Я пытаюсь написать код, который открывает папку в файловом проводнике с помощью радиообъектива. Я нашел пример, но я застрял на следующей ошибки:ТипError: askopenfilename() отсутствует 1 обязательный позиционный аргумент: 'root' In []:

Exception in Tkinter callback 
Traceback (most recent call last): 
File "C:\Program Files (x86)\Anaconda3\lib\tkinter\__init__.py", line 1550, in __call__ 
return self.func(*args) 
TypeError: askopenfilename() missing 1 required positional argument: 'root' 

Это мой код:

from tkinter import* 
from tkinter import filedialog 
import tkinter.constants 

class filedialog(tkinter.Frame): 
    def __init__(self, root): 
     tkinter.Frame.__init__(self, root) 

     Radiobutton_opt = {'fill': tkinter.constants.BOTH, 'padx': 5, 'pady': 5} 
     tkinter.Radiobutton(self, text = "Browse", 
       command = self.askopenfilename 
       ).grid(row=2, column =0, columnspan = 2, sticky =W) 
     self.file_opt = options = {} 

     self.dir_opt = options = {} 
     options['initialdir'] = 'C:\\Users\\Documents\\Python Scripts' 

    def askopenfilename(self, root): 
     filename = filedialog().askopenfilename(**self.file_opt) 
     if filename: 
      return open(filename, 'r') 

    def askdirectory(self, root): 
     return filedialog.askdirectory(**self.dir_opt) 

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

кнопка появляется, но когда я нажимаю, я получаю сообщение об ошибке. Я новичок в python и буду признателен за любую помощь.

ответ

1

У вас есть две проблемы. Во-первых, вы прямо вызываете self.askopenfilename из радиообмена, не давая ему требуемого аргумента. Это именно то, о чем вам сообщает сообщение об ошибке.

Во-вторых, вы определили класс с именем filedialog, который принимает один параметр: root. Этот класс переопределяет модуль filedialog. Таким образом, изнутри askopenfilename вы делаете рекурсивный вызов того же askopenfilename и не можете предоставить требуемый аргумент, так как self.file_opt - это пустой словарь.

+0

Спасибо за оперативную реакцию. Я понимаю, что вы говорите, но я не знаю, как реализовать это в своем коде. Не могли бы вы добавить пример? – Cucumber12

+0

@ Cucumber12: просто удалите 'root' из' def askopenfilename (self, root) ', так как вы никогда его не используете. Затем переименуйте 'filedialog' в другое. –

+0

Я фактически добавил корень в 'askopenfilename (self), чтобы избавиться от ошибки:' TypeError: __init __() отсутствует 1 обязательный позиционный аргумент: 'root' 'Я начинаю думать, что мой код не хорош :) – Cucumber12

0

Ваш askopenfilename(self, root) функция требует параметра корня, но вы ничего не пройти в вашем

tkinter.Radiobutton(self, text = "Browse", 
       command = self.askopenfilename 
       ).grid(row=2, column =0, columnspan = 2, sticky =W) 
Смежные вопросы