Создание окна toplevel при определенном условии

Пишу простенький спамер для телеграмм. Решил сделать графический интерфейс. Нужно чтобы если сессия логина не была сохранена то открывалось окно с вводом номера телефона и кода подтверждения. Подскажите как это возможно реализовать?

from tkinter import *
from telethon import TelegramClient, sync, events
from time import sleep
import random

from telethon.errors import PeerFloodError
from telethon.tl.functions.messages import SendMessageRequest
def login():
   api_id=(entry1.get())
   api_hash=(entry2.get())
   phone=(entry3.get())
   client = TelegramClient('Spam-session', api_id, api_hash)
   client.start()
   client.connect()
   client.flood_sleep_threshold = 0
   if not  client.is_user_authorized():
      def login2():
         log2 = Toplevel()
         log2.geometry('250x250')


         client.send_code_request(phone)
         client.sign_in(phone, input('Введите полученный код: '))

root=Tk()
root.title('TG Spamer')
root.geometry('800x600')
#entry block
entry1=Entry(root, width=15)
entry2=Entry(root, width=50)
entry3=Entry(root, width=15)
#label block
label1=Label(root,text='Введите api id')
label2=Label(root,text='Введите hash api')
label3=Label(root,text='Введите номер телефона')
#button block
button1=Button(root,text=u'Вторая кнопка')
button1.config(command=login)
#button block
button1.place(x=500, y=500)
#label block
label1.place(x=100,y=50)
label2.place(x=100,y=100)
label3.place(x=100,y=150)
#entry block
entry1.place(x=300,y=50)
entry2.place(x=300,y=100)
entry3.place(x=300,y=150)
root.mainloop()

Ответы (1 шт):

Автор решения: insolor

Если совсем просто, то убрать строку def login2():. То, что у вас функция находится внутри if, не значит, что она выполнится при выполнении условия. Функция выполнится только когда ее вызовут.

Просто вытащите код этой функции, чтобы в if был просто этот код, либо вытащите функцию отдельно, а в if вызывайте ее.

Т.е., вариант 1:

def login():
   api_id=(entry1.get())
   api_hash=(entry2.get())
   phone=(entry3.get())
   client = TelegramClient('Spam-session', api_id, api_hash)
   client.start()
   client.connect()
   client.flood_sleep_threshold = 0
   if not  client.is_user_authorized():
     log2 = Toplevel()
     log2.geometry('250x250')

     client.send_code_request(phone)
     client.sign_in(phone, input('Введите полученный код: '))

Вариант 2:

def login2(client, phone):
   log2 = Toplevel()
   log2.geometry('250x250')

   client.send_code_request(phone)
   client.sign_in(phone, input('Введите полученный код: '))


def login():
   api_id=(entry1.get())
   api_hash=(entry2.get())
   phone=(entry3.get())
   client = TelegramClient('Spam-session', api_id, api_hash)
   client.start()
   client.connect()
   client.flood_sleep_threshold = 0
   if not  client.is_user_authorized():
      login2(client, phone)

Пример, как вручную сделать окно запроса кода:

def login2(client, phone):
    log2 = Toplevel()
    log2.geometry('250x250')
    log2.title("Введите полученный код")
    entry = Entry(log2)
    entry.pack()
    
    result = None
    def on_ok():
        # При нажатии на кнопку OK записываем текст в локальную переменную result функции login2 и закрываем окно
        nonlocal result
        result = entry.get()
        log2.destroy()
    
    Button(log2, text="OK", command=on_ok).pack()
    
    client.send_code_request(phone)
    log2.wait_window()  # Ждем закрытия окна
    
    # Если что-то введено, посылаем команду
    if result:
        client.sign_in(phone, result)

Также можно использовать уже готовый диалог из tkinter:

from tkinter import simpledialog


def login2(client, phone):
    client.send_code_request(phone)
    
    result = simpledialog.askstring("Введите полученный код", "Введите полученный код")
    
    # Если что-то введено, посылаем команду
    if result:
        client.sign_in(phone, result)
→ Ссылка