Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 06.05.2020
Сообщений: 10

Передача переменной из функции одного класса в функцию другого класса

26.10.2021, 21:58. Показов 3123. Ответов 2

Студворк — интернет-сервис помощи студентам
Постараюсь вкратце доложить суть того, что должно происходить в программе, и с чем я столкнулся.
В главном окне программы есть кнопка вызова дочернего окна, в котором реализован, по средствам виджетов Entry, вход в базу данных. Этот "вход" передаётся в переменную, и как мне представляется передаёт введённые значения и прочее.
Вместе с тем на главном окне расположена кнопка, вызывающая функцию импорта CSV файла и создания на её основе таблицы в базе данных. В этой функции с помощью, выше описанного, "входа" создаётся курсор для создания запросов и прочий функционал.
Проблема состоит в передаче значения "входа" в функцию создания таблицы из CSV файлика.
Ошибка при запуске функции:
Python
1
TypeError: connection_to_db() missing 1 required positional argument: 'self'
При попытке передачи параметра (self.master) , ругается на недостающие атрибуты виджетов. В случае (self.slave) -
Python
1
'main' object has no attribute 'slave'
Возможно я неправильно обращаюсь к функции или неправильно указываю возвращаемое значение, либо же проблема лежит совершенно в другом. В любом случае буду благодарен каждому совету по решению проблемы.


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
from tkinter import *
from tkinter import messagebox, filedialog
import csv
import os
import psycopg2
 
mydata = []
is_conn = False
 
# Entry только чисел
class Lotfi(Entry):
    def __init__(self, master=None, **kwargs):
        self.var = StringVar()
        Entry.__init__(self, master, textvariable=self.var, **kwargs)
        self.old_value = ''
        self.var.trace('w', self.check)
        self.get, self.set = self.var.get, self.var.set
 
    def check(self, *args):
        if self.get().isdigit():
            # the current value is only digits; allow this
            self.old_value = self.get()
        else:
            # there's non-digit characters in the input; reject this
            self.set(self.old_value)
 
 
# класс главного окна
class main:
    def __init__(self, master):
        self.master = master
        self.master.title('Программа')
        self.master.geometry('550x550+300+225')
        self.master.resizable(True, False)
        self.connection_button = Button(self.master, text='Подключение к БД', command=lambda: child(self.master))
        self.connection_button.grid(row=0, column=0, stick='we')
 
        self.exit_button = Button(self.master, text='Выход', command=lambda: exit())
        self.exit_button.grid(row=0, column=2, stick='e')
 
        self.import_button = Button(self.master, text='Импорт CSV в БД', command=self.import_csv)
        self.import_button.grid(row=0, column=1, stick='e')
        self.master.mainloop()
 
    def import_csv(self):
        global mydata
        conn = child.connection_to_db()
        cur = conn.cursor()
        filename = filedialog.askopenfilename(initialdir=os.getcwd(), title='Open CSV', filetypes=(('CSV File', '*.csv'), ('All files', '*.*')))
        table_name = filename[0]
        file = open(filename, 'r')
        lines = file.readlines()
        names = lines[0].split(',')
        for i in range(1, len(lines)):
            mydata.append(lines[i].split(','))
        query = f'CREATE TABLE {table_name} (id INT PRIMARY KEY NOT NULL,'
        for i in range(0, len(mydata[0])):
            Name = names[i]
            query += Name + '' + 'VARCHAR(100),\n'
        query = query[:-2]
        query += ');'
        cur.close()
 
 
 
# класс дочернего окна
class child:
    def __init__(self, master):
        self.slave = Toplevel(master)
        self.slave.title('Подключение к БД')
        self.slave.geometry('250x160+300+225')
        self.slave.resizable(False, False)
 
        # лэйблы ввода
        self.host_label = Label(self.slave, text='Host').grid(row=0, column=0, stick='w')
        self.database_label = Label(self.slave, text='Database').grid(row=1, column=0, stick='w')
        self.user_label = Label(self.slave, text='User').grid(row=2, column=0, stick='w')
        self.password_label = Label(self.slave, text='Password').grid(row=3, column=0, stick='w')
        self.port_label = Label(self.slave, text='Port').grid(row=4, column=0, stick='w')
 
        self.host_en = Entry(self.slave, width=30)
        self.host_en.grid(row=0, column=1)
        self.database_en = Entry(self.slave, width=30)
        self.database_en.grid(row=1, column=1)
        self.user_en = Entry(self.slave, width=30)
        self.user_en.grid(row=2, column=1)
        self.password_en = Entry(self.slave, width=30, show='*')
        self.password_en.grid(row=3, column=1)
        self.port_en = Lotfi(self.slave, width=30)
        self.port_en.grid(row=4, column=1)
        self.bnt_conn = Button(self.slave, text='Подключение', command=self.connection_to_db).grid(row=5, column=0,
                                                                                                   columnspan=2,
                                                                                                   pady=10)
        self.slave.grab_set()
        self.slave.focus_set()
        self.slave.wait_window()
 
    def connection_to_db(self):
        global is_conn
        try:
            self.conn = psycopg2.connect(
                host=f"{self.host_en.get()}",
                database=f"{self.database_en.get()}",
                user=f"{self.user_en.get()}",
                password=f"{self.password_en.get()}",
                port=f"{int(self.port_en.get())}",
            )
            is_conn = True
            if is_conn:
                messagebox.showinfo(title='Успешно', message='Успешное подключение к БД')
        except psycopg2.OperationalError:
            messagebox.showerror(title='Ошибка подключения', message='Проверьте доступность хоста и корректность введённых параметров входа')
 
        self.host_en.delete(0, END)
        self.database_en.delete(0, END)
        self.user_en.delete(0, END)
        self.password_en.delete(0, END)
        self.port_en.delete(0, END)
        self.slave.destroy()
        return self.conn
 
# создание окна
root = Tk()
 
# запуск окна
main(root)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.10.2021, 21:58
Ответы с готовыми решениями:

Как обратиться к значениям переменной одного класса из метода другого класса
Есть переменная - Холодильник1 класса Freezer Холодильник1 = Freezer() Холодильник2 = Freezer() class Freezer: food...

Передача значения переменной из метода одного класса в метод другого класса
Добрый вечер! Есть основная форма Form1 в которой есть метод private void button1_Click(object sender, EventArgs e) обрабатывающий...

Передача функции из одного класса в функцию другого
Здравствуйте уважаемые форумчане. Возникла некоторая проблема. Долго пытался выкрутиться сам, но в итоге решил обратиться к...

2
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,658
27.10.2021, 13:40
Лучший ответ Сообщение было отмечено dimasikkarasiq как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from tkinter import *
from tkinter import messagebox, filedialog
import csv
import os
import psycopg2
 
mydata = []
is_conn = False
 
# Entry только чисел
class Lotfi(Entry):
    def __init__(self, master=None, **kwargs):
        self.var = StringVar()
        Entry.__init__(self, master, textvariable=self.var, **kwargs)
        self.old_value = ''
        self.var.trace('w', self.check)
        self.get, self.set = self.var.get, self.var.set
 
    def check(self, *args):
        if self.get().isdigit():
            # the current value is only digits; allow this
            self.old_value = self.get()
        else:
            # there's non-digit characters in the input; reject this
            self.set(self.old_value)
 
# класс главного окна
class main:
    def __init__(self, master):
        self.master = master
        self.master.title('Программа')
        self.master.geometry('550x550+300+225')
        self.master.resizable(True, False)
        self.connection_button = Button(self.master, text='Подключение к БД', command=self.connection)
        self.connection_button.grid(row=0, column=0, stick='we')
 
        self.exit_button = Button(self.master, text='Выход', command=lambda: exit())
        self.exit_button.grid(row=0, column=2, stick='e')
 
        self.import_button = Button(self.master, text='Импорт CSV в БД', command=self.import_csv)
        self.import_button.grid(row=0, column=1, stick='e')
        self.master.mainloop()
 
    def connection(self):
        self.child = Child(self.master)
 
    def import_csv(self):
        global mydata
        conn = self.child.conn
        cur = conn.cursor()
        filename = filedialog.askopenfilename(initialdir=os.getcwd(), title='Open CSV', filetypes=(('CSV File', '*.csv'), ('All files', '*.*')))
        table_name = filename[0]
        file = open(filename, 'r')
        lines = file.readlines()
        names = lines[0].split(',')
        for i in range(1, len(lines)):
            mydata.append(lines[i].split(','))
        query = f'CREATE TABLE {table_name} (id INT PRIMARY KEY NOT NULL,'
        for i in range(0, len(mydata[0])):
            Name = names[i]
            query += Name + '' + 'VARCHAR(100),\n'
        query = query[:-2]
        query += ');'
        cur.close()
 
# класс дочернего окна
class Child:
    def __init__(self, master):
        self.slave = Toplevel(master)
        self.slave.title('Подключение к БД')
        self.slave.geometry('250x160+300+225')
        self.slave.resizable(False, False)
 
        # лэйблы ввода
        self.host_label = Label(self.slave, text='Host').grid(row=0, column=0, stick='w')
        self.database_label = Label(self.slave, text='Database').grid(row=1, column=0, stick='w')
        self.user_label = Label(self.slave, text='User').grid(row=2, column=0, stick='w')
        self.password_label = Label(self.slave, text='Password').grid(row=3, column=0, stick='w')
        self.port_label = Label(self.slave, text='Port').grid(row=4, column=0, stick='w')
 
        self.host_en = Entry(self.slave, width=30)
        self.host_en.grid(row=0, column=1)
        self.database_en = Entry(self.slave, width=30)
        self.database_en.grid(row=1, column=1)
        self.user_en = Entry(self.slave, width=30)
        self.user_en.grid(row=2, column=1)
        self.password_en = Entry(self.slave, width=30, show='*')
        self.password_en.grid(row=3, column=1)
        self.port_en = Lotfi(self.slave, width=30)
        self.port_en.grid(row=4, column=1)
        self.bnt_conn = Button(self.slave, text='Подключение', command=self.connection_to_db).grid(row=5, column=0,
                                                                                                   columnspan=2,
                                                                                                   pady=10)
        self.slave.grab_set()
        self.slave.focus_set()
        self.slave.wait_window()
 
    def connection_to_db(self):
        global is_conn
        try:
            self.conn = psycopg2.connect(
                host=f"{self.host_en.get()}",
                database=f"{self.database_en.get()}",
                user=f"{self.user_en.get()}",
                password=f"{self.password_en.get()}",
                port=f"{int(self.port_en.get())}",
            )
            is_conn = True
            if is_conn:
                messagebox.showinfo(title='Успешно', message='Успешное подключение к БД')
        except psycopg2.OperationalError:
            messagebox.showerror(title='Ошибка подключения', message='Проверьте доступность хоста и корректность введённых параметров входа')
        self.host_en.delete(0, END)
        self.database_en.delete(0, END)
        self.user_en.delete(0, END)
        self.password_en.delete(0, END)
        self.port_en.delete(0, END)
        self.slave.destroy()
        return self.conn
 
# создание окна
root = Tk()
 
# запуск окна
main(root)
1
0 / 0 / 0
Регистрация: 06.05.2020
Сообщений: 10
27.10.2021, 15:38  [ТС]
Спасибо огромное. Ещё немного подредактировал функцию import_csv, всё работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.10.2021, 15:38
Помогаю со студенческими работами здесь

Передача структуры из одного класса в функцию другого
Здравствуйте Столкнулся с проблемой: никак не получается передать структуру объекта одно класса в функцию другого. class A { ...

Передача конструктору одного класса объект другого класса
Здравствуйте, кодеры. Столкнулся с проблемой. У меня есть 2 класса Camera и Game и соответствующие конструкторы. main.ccp ...

Как из одного класса вызвать функцию другого класса
Добрый день. Подскажите пож. как из одного класса вызвать функцию другого класса. // file1.h // #include <file2.h> ...

Вызов функции из одного класса кнопкой из другого класса
Доброго времени суток. Помогите разобраться с сигналами и слотами. Уже устал перечитывать не могу до конца понять один момент. У меня...

Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса?
//Щас всё объясню. Так, имеем два класса, в одном я определил функцию-член. Все конструкторы и прочее //опущены для уменьшения кода ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru