Передача аргумента из функции в функцию

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
Как правильно передать аргумент в другую функцию?
Примерный код:

Python:
from tkinter import *
from tkinter import filedialog

class A(self):
    def open_file(self):
        file = filedialog.askopenfile(filetypes=[('Pyton file', '*.py'), ('Python files','*.pyw'), ('Python files', '*.pyc')])#в исходнике просто file
        fname = file.name
        self.select(fname)
        ...................
    def select(self, fname):
        path_dir = os.path.dirname(fname)
        print("path_dir=", path_dir)
        .................
При таком подходе -- ошибка: missing 1 required positional argument: 'fname'
Но при этом печатает path_dir.
Т.е. переменная как бы есть, но её как бы нет.
У кого есть идеи?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
class A(self): что значит self здесь?

в вашем коде ошибка не воспроизводиться, все работает (убрана ошибка синтаксиса с self в class A(self):)
Python:
from tkinter import *
from tkinter import filedialog
import os

class A:
    def open_file(self):
        file = filedialog.askopenfile(filetypes=[('Pyton file', '*.py'), ('Python files','*.pyw'), ('Python files', '*.pyc')])#в исходнике просто file
        fname = file.name
        self.select(fname)

    def select(self, fname):
        path_dir = os.path.dirname(fname)
        print("path_dir=", path_dir)


a = A()
a.open_file() # вывод path_dir= "путь_до_файла"
 

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
В классе А self это не ошибка.
Сам приведённый код это примерный код.
Вызвать функцию с передаваемым аргументом нужно здесь:
Python:
class A:
    def open_file(self):
        file = filedialog.askopenfile(filetypes=[('Pyton file', '*.py'), ('Python files','*.pyw'), ('Python files', '*.pyc')])#в исходнике просто file
        fname = file.name
        self.select(fname)# вот здесь
Сам код довольно большой, но если надо я его выложу.
И -- да: это не бот.
Это тупо редактор кода. Где есть фрейм с деревом текущего каталога и Ноутбук с вкладками.
Весь код:
Python:
from tkinter import *
from tkinter import filedialog
import tkinter.ttk as ttk
from tkinter.ttk import  Notebook
import subprocess
import re
import os

class Tree(Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
       
        self.tree = ttk.Treeview(self, selectmode='browse')
        self.tree.column('#0', minwidth=300, width=160, stretch='yes')
        style=ttk.Style(self)
        style.theme_use("clam")
        style.configure("Treeview", background="gray", fieldbackground="darkgray", foreground="azure")
        #self.tree.bind("<Double-1>", self.on_tree_double_clicked)
       
        self.ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
        self.xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tree.xview)
        self.tree.configure(yscroll=self.ysb.set)
        self.tree.configure(xscroll=self.xsb.set)
       
        self.tree.heading('#0', text='Текущий каталог', anchor='w')
       
        self.xsb.pack(side = 'bottom', fill = 'x')
        self.ysb.pack(side = 'right', fill = 'y')
        self.tree.pack(side = 'left', fill = 'y')
        self.path_dir = None
        self.path_directory(self.path_dir)
       
    def path_directory(self, path_dir):
        path_dir = self.path_dir
        if path_dir == None:
            path = os.getcwd()
            abspath = os.path.abspath(path)
            dir_name = os.path.abspath(path).split('/')[-1]
            root_node = self.tree.insert('', 'end', text=dir_name, open=True)
            self.process_directory(root_node, abspath)
        else:
            self.process_directory(root_node, path_dir)
       
    def process_directory(self, parent, path):
        mylist = sorted(sorted(os.listdir(path)), key=lambda x: f"{x}.".split(".")[1])  #сортировать сначала всё, потом по расширению
        results = [f for f in mylist if f.endswith(('.py', 'pyw', 'pyc'))]
        for p in results:
            abspath = os.path.join(path, p)
            isdir = os.path.isdir(abspath)
            oid = self.tree.insert(parent, 'end', text=p, open=False)
            if isdir:
                self.process_directory(oid, abspath)
   
    def clear_tree(self):
         self.tree.delete(*self.tree.get_children())
       


class Note(Notebook):
   
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
       
        self.notebook = ttk.Notebook(self)
        self.notebook.pack(side = 'right', fill = 'both', expand = True)
       
        self.text_list = []
    def add_tab(self, parent, contents, name):
        text_num = Text()
        self.text_list.append(text_num)
        text = self.text_list[len(self.text_list) - 1]
        parent.add(text_num, text=name)
        text.insert('end', contents)
        last_tab = self.notebook.tabs()
        self.notebook.select(last_tab[-1])
               
class App(Tk):
    def __init__(self, parent=None, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
       
        self.minsize(width = 500, height = 500)
        self.treeview = Tree(self)
        self.note = Note(self)
        self.menu_bar = Menu(self)
        self.file_menu = Menu(self.menu_bar, tearoff = 0)
        self.menu_bar.add_cascade(label = 'Файл', menu = self.file_menu)
        self.file_menu.add_command(label = 'Открыть', command = self.open_file)
        self.config(menu = self.menu_bar)
       
        self.treeview.tree.bind('<Double-1>', self.on_tree_double_clicked)
        self.note.notebook.bind('<<NotebookTabChanged>>', self.sel_tab)
        self.note.pack(side = 'right', fill = 'both', expand = True)
        self.treeview.pack(side = 'left', fill = 'y')
       
        self.style = ttk.Style()
        self.style.configure('TNotebook.Tab', foreground = 'black')
       
    def open_file(self):
        file = filedialog.askopenfile(filetypes=[('Pyton file', '*.py'), ('Python files','*.pyw'), ('Python files', '*.pyc')])#в исходнике просто file
        fname = file.name
        print("file=", fname)
        if file:
            self.note.add_tab(self.note.notebook, file.read(), file.name.split('/')[-1])
            print("fname1=", fname)
            self.sel_tab(None, fname)
            return fname
       
    def open_file_clicked(self, path):
        file_path = os.path.abspath(path)
        with open(file_path, 'r') as f:
            self.note.add_tab(self.note.notebook, f.read(), f.name.split('/')[-1])
   
    def on_tree_double_clicked(self, event):
        selected_items = self.treeview.tree.selection()
        if not selected_items:
            return
        else:
            item_iid = selected_items[0]
            item_text = self.treeview.tree.item(item_iid, "text")
            path = item_text
            self.open_file_clicked(path)
   
    def sel_tab(self, event, fname):
        # name_tab = self.note.notebook.tab(self.note.notebook.select(), 'text')
        # command = ['locate'+ ' ' + name_tab]
        # output = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).communicate()[0]
        # output = output.decode()
        # search_results = output.split('\n')
        # print("search_results=", search_results[0])
        path_dir = os.path.dirname(fname)
        print("path_dir=", type(path_dir))
        self.treeview.clear_tree()
        self.treeview.path_directory(path_dir)

if __name__ == '__main__':

    app = App()
    app.mainloop()
Как видите у меня есть возможность обойтись и без передачи fname, но так было бы лучше.
 

PYDEV

Пользователь
Пользователь
Авг 31, 2023
32
8
8
вроде ошибок не выдает, хз, не вникал
Python:
import os
from tkinter import *
from tkinter import filedialog

FILE_TYPES = [('Pyton file', '*.py'),
              ('Python files','*.pyw'),
              ('Python files', '*.pyc')
            ]

class A:
    def open_file(self):
        file = filedialog.askopenfile(filetypes=FILE_TYPES)#в исходнике просто file
        fname = file.name
        self.select(fname)

    def select(self, fname):
        path_dir = os.path.dirname(fname)
        print("path_dir=", path_dir)
 

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
Я там выше написал -- убрать self нельзя.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
Сам код довольно большой, но если надо я его выложу.
обычно выкладывают минимально рабочий пример, демонстрирующий вашу проблему...

закомментируйте self.note.notebook.bind('<<NotebookTabChanged>>', self.sel_tab)
 

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
Угу, спасибо, гляну что там с чем связано.
Вообще то мне бинд там нужен для отображения на дереве каталога открытого файла на вкладке.
Идея простая -- переключая вкладки мы видим на дереве разные каталоги.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
Вообще то мне бинд там нужен для отображения на дереве каталога открытого файла на вкладке.
тогда используйте lambda
 

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
А это мысль, спасибо.
 

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