Ошибка: missing 1 required positional argument

weamagic

Пользователь
Пользователь
Июл 11, 2020
141
13
18
Win 10, Python 3.7, Tkinter 8.6.8
Мне надо связать между собой две функции. Одна получает путь к файлу, вторая - проделывает с ним некие операции. Мой обычный подход для решения таких моментов привёл к указанной в теме ошибке. Привожу пример кода:
Python:
from tkinter import *
import tkinter.filedialog as fld

def select():
    path = fld.askdirectory()
    load(path)
    
def load(pather):
    print(pather+'test')

Укажите, пожалуйста, на ошибку и способ её исправления.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Привожу пример кода
Нужно приводить пример который можно скопировать и запустить чтобы увидеть ошибку. В данном случае код ничего не выдаст.
Попробовал запустить так:
Python:
import tkinter as tk
from tkinter import filedialog as fd


root = tk.Tk()


def select():
    path = fd.askdirectory()
    load(path)


def load(pather):
    print(pather + 'test')


b1 = tk.Button(root, text='Выбрать файл', command=select)
b1.pack()


root.mainloop()
ошибок не выдает.
 
  • Мне нравится
Реакции: Student

weamagic

Пользователь
Пользователь
Июл 11, 2020
141
13
18
Нужно приводить пример который можно скопировать и запустить чтобы увидеть ошибку. В данном случае код ничего не выдаст.
Понял. Вот полный код:
Python:
from tkinter import *
import tkinter.filedialog as fld
import os as os

def select():
    if list_of_grid.size()!=0:
        list_of_grid.delete(1.0, END)
    path = fld.askdirectory()
    for nm in os.listdir(path):
        list_of_grid.insert(END,nm)
    load(path)

def select_data(event):
    list_of_data.insert(END, list_of_grid.get(list_of_grid.curselection()))

def load(pather):
    i=0
    while i<list_of_data.size():
        st_dat=list_of_data.get(i)
        print(pather+'/'+st_dat)
        i+=1


win = Tk()
win.geometry("1024x728")
list_of_grid = Listbox()
list_of_grid.place(x=5, y=5)
list_of_grid.config(width=60, height=30)
list_of_grid.bind('<Double-Button-1>', select_data)
btn_sel_grid = Button(text='Select grid')
btn_sel_grid.place(x=5, y=500)
btn_sel_grid.config(command=select)
list_of_data = Listbox()
list_of_data.place(x=400, y=5)
list_of_data.config(width=60, height=30)
btn_start = Button(text='Start')
btn_start.place(x=900, y=700)
btn_start.config(command=load)
win.mainloop()

А вот содержимое консоли:
Код:
Exception in Tkinter callback
Traceback (most recent call last):
  File "Z:\ana\envs\frag5\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
TypeError: load() missing 1 required positional argument: 'pather'
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
В ошибке написано что для функции load на хватает одного позиционного аргумента 'pather'. Это происходит при вызове этой функции после нажатия на кнопку start. Ошибка возникает потому что при привязке функции к кнопке не был указан аргумент:
Python:
btn_start.config(command=load)
чтобы исправить - можно привязать к кнопке вызов функции с нужным аргументом, например:
Python:
btn_start.config(command=lambda: load(fld.askdirectory()))
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
141
13
18
В ошибке написано что для функции load на хватает одного позиционного аргумента 'pather'. Это происходит при вызове этой функции после нажатия на кнопку start. Ошибка возникает потому что при привязке функции к кнопке не был указан аргумент:
Python:
btn_start.config(command=load)
чтобы исправить - можно привязать к кнопке вызов функции с нужным аргументом, например:
Python:
btn_start.config(command=lambda: load(fld.askdirectory()))
Ок. Спасибо. Буду пробовать. Я думал, что в самой функции ошибка. Про привязку к кнопке - даже не посещало.
 

Форум IT Специалистов