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

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

26.10.2021, 21:58. Показов 3142. Ответов 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
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
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
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru