Форум сайта python.su
0
Добрый день!
Не получается передать переменную из класса 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)
Офлайн
857
krisakЗачем передавать переменные из класса в класс? Классы вообще не участвуют в работе программы. В соответствии с их структурой создаются объекты (экземпляры этих классов с временем жизни и занимаемой памятью) и вот эти объекты и делают всё. Так что сначала найди, где у тебя объекты, а потом уже думай о передаче информации между этими объектами. Возможно, нужен дополнительный объект, через который и осуществляется передача информации от одного объекта другому. Вопросы про классы и передачу чего-то между ними выглядят некомпетентно.
Не получается передать переменную из класса Connectad def connad в Query def adoffice.
Отредактировано py.user.next (Апрель 30, 2023 03:45:35)
Офлайн
0
py.user.next
Офлайн
857
krisakТогда тебе нужно написать, в чём состоит задача. Код-то никто не пишет сходу. Это как строить дом, никто не хватает кирпич и не идёт строить дом со словами “сейчас вот кирпич положу и построю из него дом”. Сначала думают, что будут строить, потом думают, как это будут строить, потом уже думают, какие ресурсы для этого нужны, и там много всего сначала прорабатывают (проектная документация), а потом уже, когда проект готов, берут план, раздают задания и начинают реализовывать его по частям. Так же и в программировании происходит. Это инженерная работа, инженерное дело.
мне нужно не готовое решение, а понять что и как сделать
Офлайн
0
py.user.nextЗада ча состоит в том, что я пытаюсь сделать приложение с GUI. Первый Frame это ввод логина и пароля с проверками, если все хорошо, открываем следующий фрейм. В нем мы можем делать какие-то действия, но действия возможны только от подключенной записи, которая коннектится к Active Directory. По сути мне надо передать из 1 Frame, во второй подключение к AD
Офлайн
857
krisakЧто ты пытаешься сделать, мы это и так видим. И что говнокода ты написал тонну, мы это тоже видим. А вот про то, что нужно написать, ты не написал ничего. Что бы ты хотел бы увидеть в итоге, написанное тобой или не тобой, и как оно должно работать, когда оно правильно работает и так далее.
Зада ча состоит в том, что я пытаюсь сделать приложение с GUI.
krisakПриложение с GUI ты уже написал. Вот это говно - это приложение с GUI. И что же тебя не устраивает теперь в нём? Наверное то, что оно нихера не делает из того, что нужно. Понимаешь? Вот о чём речь.
я пытаюсь сделать приложение с GUI
krisakНе надо писать про код, как он там работает.
Первый Frame это ввод логина и пароля с проверками, если все хорошо, открываем следующий фрейм.
krisakДаже если ты это сделаешь, ты цели не достигнешь, потому что у тебя каша в голове, ты просто даже не понимаешь, что ты пытаешься сделать в итоге. И поэтому ты не можешь мне объяснить.
По сути мне надо передать из 1 Frame, во второй подключение к AD
Отредактировано py.user.next (Май 2, 2023 11:36:28)
Офлайн
0
py.user.nextИсправляюсь.
Офлайн
61
В целом какой то кривой подход как и указал 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
Отредактировано ZerG (Май 2, 2023 14:32:08)
Офлайн
124
krisak
Я только начинаю изучать и вникать, а можно немного подробнее? про return я знаю, мне нужно не готовое решение, а понять что и как сделать
print()
print('hello')
input()
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
Офлайн
124
примерно так
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()
Офлайн