Найти - Пользователи
Полная версия: Передать переменную из класса в класс
Начало » Python для новичков » Передать переменную из класса в класс
1 2
krisak
Добрый день!

Не получается передать переменную из класса Connectad def connad в Query def adoffice. Всю голову сломал.

 class App(Tk):
    def __init__(self):
        Tk.__init__(self)
        self._frame = None
        self.switch_frame(Connectad)
       
  
    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()
class Connectad(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        Label(self,text='Логин:').grid(row=0)
        self.login_field = Entry(self,width=30)
        self.login_field.grid(row=0,column=1)
        Label(self,text='Пароль:').grid(row=1)
        self.pw_field = Entry(self,show = '*', width=30)
        self.pw_field.grid(row=1,column=1)
        self.notlogon = Label(self,text='Не верный логин или пароль',fg='red', font=("Arial", 14))
        self.notlogon.grid_remove
        send_button = Button(self, text='Отправить',bg='#4a7abc',
                                                    fg='yellow',
                                                    activebackground='green',
                                                    activeforeground='white',command=self.connad).grid(row=3, column=2, sticky=W, pady=4)
    def validationlogin(self): #Проверка логина и пароля на пустые поля
        pw = self.pw_field.get()
        login = self.login_field.get()
        msg = ''
        if len(pw) == 0 or len(login) == 0:
            msg = 'Логин или пароль не могут быть пустыми'
            mb.showinfo('message', msg)
        else:
            self.connad()
    def connad(self): # Подключение к AD
        self.AD_SERVER = 'dc.world.local'
        self.AD_USER = self.login_field.get()
        self.AD_PASSWORD = self.pw_field.get()
        self.AD_SEARCH_TREE = 'dc=world,dc=local'
        self.AD_SEARCH_OU = 'ou=users,dc=world,local'
        self.server = Server(self.AD_SERVER, use_ssl=True)
        self.conn = Connection(self.server,user=self.AD_USER,password=self.AD_PASSWORD)
        print(self.conn.bind)
        if not self.conn.bind():
            print('False')
        elif self.conn.bind():
            self.parent.switch_frame(Query)
        
class Query(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        #self.wind = window
        #self.wind.title('Создание пользователя')
   
        self.message = Label(self,text = '', fg = 'green').grid(row = 3, column = 0, columnspan = 2, sticky = W + E)
            # таблица слов и значений
        columns = ("#1", "#2", "#3", "#4", "#5")
        self.tree = ttk.Treeview(self,height = 20, columns = columns)
        self.tree.grid(row = 4, column = 0, columnspan = 4)
        self.tree.heading('#0', text = 'Фамилия', anchor = CENTER)
        self.tree.heading('#1', text = 'Имя', anchor = CENTER)
        self.tree.heading('#2', text = 'Отчество', anchor = CENTER)
        self.tree.heading('#3', text = 'Логин', anchor = CENTER)
        self.tree.heading('#4', text = 'Отдел', anchor = CENTER)
        self.tree.heading('#5', text = 'Заявитель', anchor = CENTER)
            # кнопки редактирования записей
        ttk.Button(self,text = 'Принять', command = self.adoffice).grid(row = 5, column = 2, sticky = W + E)
        ttk.Button(self,text = 'Изменить', command = self.edit_word).grid(row = 5, column = 1, sticky = W + E)
        ttk.Button(self,text = 'Обновить', command = self.get_words).grid(row = 5, column = 0, sticky = W + E)
        #ttk.Button(text = 'Выход', command = self.wind.destroy).grid(row = 5, column = 3, sticky = W + E)
            # заполнение таблицы
        self.get_words()
    def mailoffice(self,cn,otdel): # Создание почты Офиса
        psconn = subprocess.run(['powershell', '$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://mail01/PowerShell/ -Authentication Kerberos;', 'Import-PSSession $Session -DisableNameChecking;',f'Enable-Mailbox -Identity {cn} -Database BykIT2021;', 'Remove-PSSession $Session;'])
    def adoffice(self): # Создание пользователя офис
         famaly = self.tree.item(self.tree.selection())['text']
        nameuser = self.tree.item(self.tree.selection())['values'][0]
        nameuser2 = self.tree.item(self.tree.selection())['values'][1]
        cn = self.tree.item(self.tree.selection())['values'][2]
        otdel =  self.tree.item(self.tree.selection())['values'][3]
        conn.search('DC=world,DC=local',f'(&(objectclass=user)(sAMAccountName={cn}))', attributes=['sAMAccountName'])
        print(conn.entries)
        if not conn.entries:
            conn.add(f'CN={famaly} {nameuser} {nameuser2},OU={otdel},OU=USERS,DC=world,DC=local', 'user',
                                                                                                        {'cn': f'{famaly} {nameuser} {nameuser2}',
                                                                                                        'givenName': {nameuser},
                                                                                                        'sn': {famaly},
                                                                                                        'department': {otdel},
                                                                                                        'company': 'world',
                                                                                                        'initials': {nameuser2[0]},
                                                                                                        'info': {gp.genpass},
                                                                                                        'displayName': f'{famaly} {nameuser} {nameuser2}',
                                                                                                        'sAMAccountName': {cn},
                                                                                                        'userPrincipalName': f'{cn}@world.local',
                                                                                                        f'telephoneNumber': '0001' 
                                                                                                        })
            conn.extend.microsoft.unlock_account(f'CN={famaly} {nameuser} {nameuser2},OU={otdel},OU=USERS,DC=world,DC=local')
            conn.extend.microsoft.modify_password(f'CN={famaly} {nameuser} {nameuser2},OU={otdel},OU=USERS,DC=world,DC=local', new_password=gp.genpass, old_password=None)
            conn.modify(f'CN={famaly} {nameuser} {nameuser2},OU={otdel},OU=Users,DC=world,DC=local', {'userAccountControl': (MODIFY_REPLACE, [512])})
            self.mailoffice(cn,otdel)
            self.close_request(cn)
py.user.next
krisak
Не получается передать переменную из класса Connectad def connad в Query def adoffice.
Зачем передавать переменные из класса в класс? Классы вообще не участвуют в работе программы. В соответствии с их структурой создаются объекты (экземпляры этих классов с временем жизни и занимаемой памятью) и вот эти объекты и делают всё. Так что сначала найди, где у тебя объекты, а потом уже думай о передаче информации между этими объектами. Возможно, нужен дополнительный объект, через который и осуществляется передача информации от одного объекта другому. Вопросы про классы и передачу чего-то между ними выглядят некомпетентно.

Когда смотрю на этот код, у меня возникает только один вопрос: ты что-нибудь слышал про оператор return?
krisak
py.user.next

Я только начинаю изучать и вникать, а можно немного подробнее? про return я знаю, мне нужно не готовое решение, а понять что и как сделать
py.user.next
krisak
мне нужно не готовое решение, а понять что и как сделать
Тогда тебе нужно написать, в чём состоит задача. Код-то никто не пишет сходу. Это как строить дом, никто не хватает кирпич и не идёт строить дом со словами “сейчас вот кирпич положу и построю из него дом”. Сначала думают, что будут строить, потом думают, как это будут строить, потом уже думают, какие ресурсы для этого нужны, и там много всего сначала прорабатывают (проектная документация), а потом уже, когда проект готов, берут план, раздают задания и начинают реализовывать его по частям. Так же и в программировании происходит. Это инженерная работа, инженерное дело.

Если ты предложил посмотреть твой треугольный дом с пятиугольными окнами, который ты вылепил из пластилина, то из этого никак нельзя сказать, что тебе нужен четырёхугольный дом с четырёхугольными окнами из кирпичей и бетона.

Так что опиши задачу словами.
krisak
py.user.next
Зада ча состоит в том, что я пытаюсь сделать приложение с GUI. Первый Frame это ввод логина и пароля с проверками, если все хорошо, открываем следующий фрейм. В нем мы можем делать какие-то действия, но действия возможны только от подключенной записи, которая коннектится к Active Directory. По сути мне надо передать из 1 Frame, во второй подключение к AD
py.user.next
krisak
Зада ча состоит в том, что я пытаюсь сделать приложение с GUI.
Что ты пытаешься сделать, мы это и так видим. И что говнокода ты написал тонну, мы это тоже видим. А вот про то, что нужно написать, ты не написал ничего. Что бы ты хотел бы увидеть в итоге, написанное тобой или не тобой, и как оно должно работать, когда оно правильно работает и так далее.

krisak
я пытаюсь сделать приложение с GUI
Приложение с GUI ты уже написал. Вот это говно - это приложение с GUI. И что же тебя не устраивает теперь в нём? Наверное то, что оно нихера не делает из того, что нужно. Понимаешь? Вот о чём речь.

krisak
Первый Frame это ввод логина и пароля с проверками, если все хорошо, открываем следующий фрейм.
Не надо писать про код, как он там работает.

krisak
По сути мне надо передать из 1 Frame, во второй подключение к AD
Даже если ты это сделаешь, ты цели не достигнешь, потому что у тебя каша в голове, ты просто даже не понимаешь, что ты пытаешься сделать в итоге. И поэтому ты не можешь мне объяснить.

Всё. Забудь слова фрейм, окно, класс, метод, переменная. Вот словесно всё и опиши. Ну, например “мне нужно у пользователя взять логин и пароль, потом подключиться с ними туда-то и потом с использованием актив директори выполнить такие-то действия, а после этого сделать то-то и то-то”. Как видишь, ни одного слова про питон или его элементы или tkinter и его части тут нет.
krisak
py.user.next
Исправляюсь.

Приложение должно брать логин и пароль у пользователя, проверять на соответствие и подключение и если все хорошо, то мы должны иметь возможность изменять, обновлять данные и получать. Взаимодействуя с этими данными.
ZerG
В целом какой то кривой подход как и указал py.user.next.

Но в твоем примитивном случае в самом начале твоего “скрипта” можно просто добавить переменную типа
 user_state = False

а дальше уже твой класс аутентификации проводит проверку и если все ок - обновляет данную переменную
Второй класс с основным запуском проверяет ету же переменную и если она Тру - запускается если нет - незапускается

С кучей переменных выйдет каша конечно редкая с кучей проблем
Тут можно красиво разойтись использовав класс на питоне неким аналогим структур на других языках программирования
 class State:
    def __init__(self):
        self.__auth = False
        self.__age = 0
        self.__name = ""
    @property
    def auth(self):
        return self.__auth
    @auth.setter
    def auth(self, status):
        self.__auth = status
    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self, val):
        self.__age = val
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self, string):
        self.__name = string
user = State()
def ushow():
    print(f"User auth: {user.auth}")
    print(f"User age: {user.age}")
    print(f"User name: {user.name}")
    print("\n")
def uset(auth, age, name):
    user.auth = auth
    user.age = age
    user.name = name
ushow()
uset(True, 20, "Felix")
ushow()

User auth: False
User age: 0
User name:


User auth: True
User age: 20
User name: Felix


Думаю для наглядности понятно. Тут же в самих функциях можно организовать проверки типов или нужные тебе
и хранить обьекты так как класс и есть обьект и ты с ниим и работаешь

Но повторюсь все это какаято струганина
У тебя должен быть основное тело программы которое запускает ту или иную графф оболочку и по результатам ее работы запускает другую например стартует с окном запроса логина пароля - если окей - стартует главное окно программы - если нет модальное окно с “ПНХ”
То есть на данный момент твоя главная ошибка в том что у тебя главная программа это твое главное окно - тебе нужно выйти перед ним оно зрительно главное но по сути всего лишь звено цеии - а главное тело программы - его никто и не видит
Удачи




xam1816
krisak
Я только начинаю изучать и вникать, а можно немного подробнее? про return я знаю, мне нужно не готовое решение, а понять что и как сделать

Тут нужно правильно все это представлять. Все вокруг нас информация. Она перетекает из одного пространства в другое и может менять свою структуру.

Алгоритм - это шаги, последовательность, во время которых меняется информация.

Программа - это последовательность алгоритмов, через которые проходит информация.

Программирование - это написание алгоритмов и объединение их в программе.

Задача программирования - решение какой либо проблемы, задачи



Пространство в программировании может например быть функцией. Возьмем например
 print()

там где скобки - это место куда входит информация. Мы можем не знать, как там внутри это все работает, но знаем, что все что в нее попадает выводится на экран

 print('hello')

выведет в консоли ‘hello’

возьмем другую функцию
 input()

с помощью нее мы можем вернуть строку введенную в консоли и сохранить в какой либо переменной

 var = input()

после ввода в консоли и нажатия enter введенная строка сохраняется в переменной var

В этих двух примерах видно как информация перетекает из одного пространства в другое. Из пространства консоль - в переменную и наоборот

Эту информацию мы не как пока не меняем и не используем, и проблемы это никакой не решает.

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

например мне нужно посчитать сколько слов в предложении.

Рассуждаем, сначала нужно поместить нужную информацию в память компьютера, в переменную.

Это можно сделать через input()

Далее эту переменную, хранящую эту информацию нужно отправить в пространство,где предложение будет разделено на отдельные слова и возвращено из этого пространства в виде списка слов

список слов сохраняем в переменную

Далее список всех слов отправить в пространство, где они будут считаться и в результате будет возвращаться число

это число мы сохраняем в какую-то переменную

далее эту переменную мы отправляем в пространство, которое выводит в консоль.

конец программы

На входе предложение => на выходе число слов

  
def split_str(s):
    return s.split()
 
def count_words(word_lst):
    return len(word_lst)
 
input_str = input('>>>')
 
word_lst = split_str(input_str)
 
res = count_words(word_lst)
 
print(res)

>>>шла Саша по шоссе и сосала сушку
7

Process finished with exit code 0

xam1816
примерно так

  
import tkinter as tk
 
class InputField(tk.Frame):
    def __init__(self, master, name, hidden=False):
        super().__init__(master)
        self.lbl = tk.Label(self, text=name, width=10)
        self.entry = tk.Entry(self, width=25)
        self.lbl.grid(row=0, column=0)
        self.entry.grid(row=0, column=1)
        if hidden:
            self.entry.config(show='*')
 
    def get(self):
        return self.entry.get()
 
class LoginFrame(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.login = InputField(self, 'login')
        self.password = InputField(self, 'password', hidden=True)
        self.btn = tk.Button(self, text='sign', command=self.on_click)
        self.lbl_error = tk.Label(self)
        #
        self.login.pack()
        self.password.pack()
        self.btn.pack()
        #
        self.func_handler = None
 
    def on_click(self):
        if self.func_handler:
            self.func_handler(self.login.get(), self.password.get())
 
    def show_error(self):
        self.lbl_error['text'] = 'не верный логин или пароль'
        self.lbl_error.pack()
 
class MainFrame(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.lbl = tk.Label(self, text='основное окно программы', font='Arial 36 bold')
        self.lbl.pack()
 
        self.tel_field = InputField(self, 'телефон')
        self.email_field = InputField(self, 'email')
        #
        self.tel_field.pack()
        self.email_field.pack()
        #
        self.btn = tk.Button(self, text='отправить код', command=self.on_click)
        self.btn.pack()
        #
        self.lbl_status = tk.Label()
        self.func_handler = None
  
    def show_message(self):
        self.lbl_status['text'] = 'код отправлен'
        self.lbl_status.pack()
         
    def on_click(self):
        if self.func_handler:
            self.func_handler(self.tel_field.get(), self.email_field.get())
class MainWin(tk.Tk):
    def __init__(self):
        super().__init__()
        self.login_frame = LoginFrame(self)
        self.main_frame = MainFrame(self)
        self.state_login()
    def all_frame_pack_forget(self):
        for w in self.winfo_children():
            w.pack_forget()
    def state_login(self):
        self.all_frame_pack_forget()
        self.login_frame.pack()
    def state_main_frame(self):
        self.all_frame_pack_forget()
        self.main_frame.pack()
    def run(self):
        self.mainloop()
 
class Program:
    def __init__(self):
        self.main_win = MainWin()
        self.main_win.login_frame.func_handler = self.validate
        self.main_win.main_frame.func_handler = self.send_secret
 
    def validate(self, login, password):
        if login == 'admin' and password == '1234':
            self.main_win.state_main_frame()
        else:
            self.main_win.login_frame.show_error()
 
    def send_secret(self, *args):
        print(*args)
        print('на почту и телефон пришел код')
        self.main_win.main_frame.show_message()
 
    def run(self):
        self.main_win.run()
 
if __name__ == '__main__':
    Program().run()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB