Создание окна 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 шт):
Если совсем просто, то убрать строку 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)