Я пытаюсь использовать исходный текст tk из одного класса в другой в python, tkinter

#python #class #variables #inheritance #tkinter

#python #класс #переменные #наследование #tkinter

Вопрос:

Я пытаюсь ввести текст имени пользователя 1 и имени пользователя 2 tk с начальной страницы класса на страницу хэштега класса, когда я тестирую с помощью print в HastaPage, я получаю результат :

<class ‘tkinter.Запись’> .!hashtag_page.!startpage2.!entry2

Также я пытаюсь использовать функцию в def set_time() из StartPage в HastagPage класса start_hastag() func. Вывод

Ошибка имени: имя ‘set_time’ не определено

 class StartPage(tk.Frame):
     def __init__(self, master):
         tk.Frame.__init__(self, master)
         tk.Label(self, text="Enter Username").pack(side="top", fill="x", pady=10)
         self.username = tk.Entry(self,)
         self.username.pack()
         tk.Label(self, text='Enter Pssword').pack(side='top', fill='x', pady=10)
         self.password = tk.Entry(self)
         self.password.pack()
         global password1, username1
         password1 = self.password
         username1 = self.username
         if(username.get('text') == None or password.get('text') == None):
            tk.Button(self, text="Login",
               command=lambda: master.switch_frame(StartPage)).pack()
         else:
            tk.Button(self, text="Login", command=lambda: master.switch_frame(PageOne)).pack()
     def set_time():
         time.sleep(160)

class Hashtag_page(tk.Frame):
    def  __init__(self, master):
        tk.Frame.__init__(self, master)
        self.hastag_lbl = tk.Label(self, text='Choice file with hashtags')
        self.hastag_lbl.pack(side='top',fill='x',pady=10)
        tk.Button(self, text='Browse files', command=self.browseFiles_hstg).pack()
        tk.Label(self, text='Enter how much likes, follows action per hastag').pack()
        self.amount_num = tk.Entry(self).pack()
        tk.Button(self, text='Start Bot', command=self.start_hashtag).pack()
        tk.Button(self, text='Back', command=lambda: master.switch_frame(PageOne)).pack()

    def browseFiles_hstg(self): 
        filename = filedialog.askopenfilename(initialdir = "/", 
                                          title = "Select a File", 
                                          filetypes = (("Text files", 
                                                        "*.txt*"), 
                                                       ("all files", 
                                                        "*.*"))) 
        # Change label contents 
        self.hastag_lbl.configure(text = filename)


    def start_hashtag(self):
        username_ = StartPage(self).username1
        password = StartPage(self).password1
        print(username1.get(),password1.get())
        set_time()
 

Ответ №1:

похоже, вы пытаетесь вызвать функцию, вложенную в класс. Это разрешено, но обязательно вызывайте set_time() с StartPage.set_time()

Я бы посоветовал переместить set_time() метод из класса StartPage и полностью поместить его в класс Hashtag_page, поскольку он никогда не вызывается в StartPage, но это зависит от вас.

Посмотрите этот пример вызова метода ExampleClassA внутри ExampleClassB

 class ExampleClassA:
    def add_two_in_a(num1, num2):
        return num1   num2

class ExampleClassB:
    def __init__(self):
        print("Initialized a new 'B' class")
        result1 = ExampleClassA.add_two_in_a(1, 3)
        result2 = ExampleClassA.add_two_in_a(2, 5)
        print("Calling a function in class Example class A from example class B")
        print("Result 1 is {}nResult 2 is {}".format(result1, result2))

if __name__ == "__main__":
    ExampleClassB()
 

Комментарии:

1. Спасибо, я попробую этот способ, потому что мне нужно использовать метод set_time() и в других классах. Таким же образом я могу получить доступ к переменным имени пользователя и пароля, но метод .get() не возвращает текст из виджета tkinter. Любое преимущество

2. Когда я создал несколько примеров полей ввода TkInter и запустил их .get() без каких-либо аргументов, они вернули значения, как и ожидалось, но когда я передал .get('text') , я получил TypeError, в котором говорится, что .get() — получено 2 аргумента, ожидается 1. Поэтому я бы попробовал изменить .get('text') -> .get()

3. Да, в этом тексте используется метка формы, но в любом случае я не могу передать значение в метод start_hastag()

4. Я также пытаюсь создать ethod def get_value() и извлекать значения в satrt_hashtag() Я получаю ошибку атрибута: объект типа ‘StartPage’ не имеет атрибута ‘login_data’

5.Я заметил, что вы пытаетесь обнаружить пустой ввод при отправке. Пустой ввод не будет возвращен None , при его использовании .get() будет возвращена » — строка длиной 0, поэтому вместо того, чтобы проверять, эквивалентно ли это None проверке len(username.get()) < 1 и совпадению с password.get() . Короткий ответ на невозможность получить StartPage.login_data заключается в том, что in __init__(self, master) self.login_data никогда не определяется в class StartPage.