передать переменную из функции в другую функцию, созданную до этого

Рейтинг: 0Ответов: 2Опубликовано: 24.08.2023
class Bot():
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("бот бомж версия")
        self.root.geometry("300x250")
    
        self.label = tk.Label(self.root, text = "Напиши запрос кожаный ублюдок:")
        self.label.grid(column = 0, row = 0)

        self.label = tk.Label(self.root, text = "бот:" + str(self.text_bot))
        self.label.grid(column = 0, row = 2)

        self.txt = tk.Entry(self.root, width = 30)
        self.txt.grid(column = 0, row = 1)
    
        self.btn = tk.Button(self.root, text = "отправить запрос", command = self.Parser)
        self.btn.grid(column = 1, row = 1)

        self.root.mainloop()
        
    def Parser(self):
        self.driver = webdriver.Chrome(ChromeDriverManager().install())
        self.driver.set_window_position(1900,1004)
        self.request = self.txt.get()
        
        self.driver.get("https://trychatgpt.ru/#rec607352631")
        
        self.search_line = self.driver.find_element(by = By.ID, value = "input")
        self.search_button = self.driver.find_element(by = By.ID, value = "send")

        self.search_line.send_keys(self.request)
        self.search_button.click()
        
        sleep(20)
        self.ordinary_class = self.driver.find_elements(by = By.CLASS_NAME, value = "message")
        for i in range(0, len(self.ordinary_class)):
            if i == (len(self.ordinary_class)-1):
                self.bot_answer = self.ordinary_class[i]
                
        self.text_bot = self.bot_answer.text
        self.driver.quit()           
Bot()

Знаю, код может быть кривой и немного не логичный, но всё же. К сути, есть переменная self.text_bot её надо передать из Parser(self) в init(self) в self.Label. Если можно, то с минимальными изменениями в коде.

Ответы

▲ 0

есть небольшое пожелание, оставляй библиотеки, которые используешь. давай разберемся как работают классы: создадим небольшой класс, имя test, входные данные a и b.

class test:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def two(self):
        return self.a, self.b

понимаешь, если ты делаешь переменные через self, они доступны везде, даже если так: print(test.a). в классе, self это сам класс. через него ты можешь получить доступ ко всем переменным класса, созданным через self. но если ты хочешь, чтобы они были не доступны за пределами класса, делай через global, пример:

global a, b

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

class Bot():
    def __init__(self, lbl="Напиши запрос кожаный ублюдок: "):
        self.root = tk.Tk()
        self.root.title("бот бомж версия")
        self.root.geometry("300x250")
    
        self.label = tk.Label(self.root, text = lbl)
        self.label.grid(column = 0, row = 0)

        self.label = tk.Label(self.root, text = "бот:" + str(self.text_bot))
        self.label.grid(column = 0, row = 2)

        self.txt = tk.Entry(self.root, width = 30)
        self.txt.grid(column = 0, row = 1)
    
        self.btn = tk.Button(self.root, text = "отправить запрос", command = self.Parser)
        self.btn.grid(column = 1, row = 1)

        self.root.mainloop()
        
    def Parser(self):
        self.driver = webdriver.Chrome(ChromeDriverManager().install())
        self.driver.set_window_position(1900,1004)
        self.request = self.txt.get()
        
        self.driver.get("https://trychatgpt.ru/#rec607352631")
        
        self.search_line = self.driver.find_element(by = By.ID, value = "input")
        self.search_button = self.driver.find_element(by = By.ID, value = "send")

        self.search_line.send_keys(self.request)
        self.search_button.click()
        
        sleep(20)
        self.ordinary_class = self.driver.find_elements(by = By.CLASS_NAME, value = "message")
        for i in range(0, len(self.ordinary_class)):
            if i == (len(self.ordinary_class)-1):
                self.bot_answer = self.ordinary_class[i]
                
        self.text_bot = self.bot_answer.text
        self.driver.quit()
        self.__init__(lbl=self.text_bot)
Bot()

если не работает, пожалуйста, напиши библиотеки и дай знать.

▲ 0

Всё что вы объявляете в методе __init__ через self становится доступным и в других методах класса, поэтому вам не нужно ничего никуда передавать. Можно "на месте" всё обновить.

class Bot():
    def __init__(self):
        self.root = tk.Tk()

        self.label =  tk.Label(self.root, text='бот:')
        self.label.grid(column=0, row=0)
 
        self.btn = tk.Button(self.root, text='click me', command=self.parser)
        self.btn.grid(column=1, row=1)
        
        self.root.mainloop()
        
    def parser(self):
        self.label.config(text='какой-то текст')

Так при вызове метода parser текст в элементе обновится.