@ismail_2007

Как можно параллельно запустить две функции в данной программе?

Привет всем! Я пытаюсь запустить функцию mail_thread() параллельно всей остальной программе. У меня уже были попытки сделать это, но всегда работало либо только окно, а затем уже срабатывала функция, либо функция, а окно вовсе и не открывалось. Есть идеи, как это реализовать?
Вот код класса главного окна:
class Main(tk.Frame):
    def __init__(self, root, user_name):
        super().__init__(root)
        self.user_name = user_name
        self.db = db
        self.db.cur = self.db.conn.cursor()
        self.db.cur2 = self.db.conn2.cursor()
        self.init_main()
        self.get_mail_class_start = get_mail_class_start
        self.init_mail_thread = threading.Thread(target = self.mail_thread, args = ())
        self.init_mail_thread.start()

 
    def init_main(self):
 
        btn_database_workers = tk.Button(root, padx = 20, pady = 1, text = 'WORKER', bg = '#2A3132',fg = '#336B87',
                                         activebackground = '#2A3132', relief = tk.FLAT, activeforeground = '#336B87',
                                         compound = tk.TOP, font = ('COMIC SANS MS', 60), command = self.open_database)
        
        btn_database_workers.pack()
        btn_database_workers.place(x=150, y=20)
 
        worker_lbl = tk.Label(text = 'Работники', bg = '#2A3132', fg = '#336B87', font = ('COMIC SANS MS',20))
        worker_lbl.pack()
        worker_lbl.place(x = 50,y = 160)
 
        worker_lbl2 = tk.Label(text = 'Задания', bg = '#2A3132', fg = '#336B87', font = ('COMIC SANS MS',20))
        worker_lbl2.pack()
        worker_lbl2.place(x = 530,y = 160)
 
        scframe = VerticalScrolledFrame(root)
        scframe.pack()
        scframe.place(x = 20,y = 200)
 
        scframe2 = VerticalScrolledFrame2(root)
        scframe2.pack()
        scframe2.place(x = 500,y = 200)
 
        for value in self.db.cur.execute("SELECT name FROM tbl"):
            massive = list(value)
            btn = tk.Button(scframe.interior, height=2, width=35, relief=tk.FLAT, 
                        bg='#336B87', activebackground = '#2A3132', activeforeground = '#336B87', fg = '#2A3132',
                        font=("COMIC SANS MS", 0), text=massive[0],command = partial(self.dialog, massive[0]))
            btn.pack(padx=10, pady=5, side=tk.TOP)
 
        for value2 in self.db.cur2.execute("SELECT task_name FROM task"):
            massive2 = list(value2)
            btn2 = tk.Button(scframe2.interior, height = 2, width = 35, relief = tk.FLAT, 
                        bg = '#336B87', activebackground = '#2A3132',activeforeground = '#336B87', fg = '#2A3132',
                        font = ("COMIC SANS MS", 0), text = massive2[0], command = partial(self.taskmenu, massive2[0]))
            btn2.pack(padx=10, pady=5, side=tk.TOP)
 
 
    def open_database(self):
        Child()
 
    def dialog(self, user_name):
        DialogMenu(user_name)
 
    def taskmenu(self, task_name):
        TaskMenu(task_name)
    
    
    def mail_thread(self):
        time.sleep(1)
        self.after(True,get_mail_class_start.get_mail_func())

Вот код диалогового окна:
class DialogMenu(tk.Toplevel):
    def __init__(self,user_name):
        super().__init__(root)
        self.user_name = user_name
        self.db = db
        self.get_mail_class_start = get_mail_class_start
        self.send_mail = Mail_class(user_name, smtplib.SMTP('smtp.gmail.com:587'))
        self.db.cur = self.db.conn.cursor()
        self.init_dialog_thread = threading.Thread(target = self.init_dialog, args =())
        self.init_dialog_thread.start()




    def retrieve_message_input(self):
        self.messsage_text = self.Message_Text.get(1.0, tk.END)
        self.send_mail.send_mail(self.messsage_text)
 
    def init_dialog(self):
        
        self.geometry('600x550')
        self.resizable(False,False)
        self['bg'] = '#2A3132'
        self.minsize(width = 900, height = 550) 
        self.title(f'Диалог с {self.user_name}')
 
        server = 'smtp.gmail.com:587'
        self.send_mail.start_client(server)
        
        self.Send_btn = tk.Button(self,text = '',padx=15,pady=12.5,bd=5,font=('Ubuntu',35),
                             bg = '#336B87',command = partial(self.dialog_db,self.user_name))
 
        self.Send_btn_sms = tk.Button(self,text = '➤',padx = 15,pady = 13,font = ('Ubuntu',35),bd = 5,
                                      bg = '#336B87', command = self.retrieve_message_input)
 
        self.Message_Text = tk.Text(self,width = 45,height = 5,bg='white',fg='black',font = 50)
        self.frame = tk.Frame(self)
        self.text = tk.Text(self.frame, width=85, height=22)
        self.scroll = tk.Scrollbar(self.frame, command=self.text.yview)
        self.scroll.pack(side=tk.RIGHT, fill=tk.Y)
        self.text.config(yscrollcommand=self.scroll.set)
        self.text.insert(tk.INSERT,("text" + '\n') * 50)
        self.text.configure(state='disabled')
 
        self.text.pack(side=tk.TOP) 
        self.text.place()
 
        self.frame.pack(side=tk.TOP)
        self.Send_btn.pack()
        self.Send_btn_sms.pack()
        self.Message_Text.pack()
 
        self.Send_btn.place(x = 670,y = 400)
        self.Send_btn_sms.place(x = 545, y = 400)
        self.Message_Text.place(x = 34,y = 400)
  
    def dialog_db(self, user_name):
        DialogDB(user_name)


Вот последняя часть кода:
if __name__ == '__main__':
    
    get_mail_class_start = get_mail_class(imaplib.IMAP4_SSL('imap.gmail.com') )
    root = tk.Tk()
    db = DB()
    app = Main(root, '***********')
    root['bg'] = '#2A3132'

    app.pack()
    root.title('Main')
    root.geometry('1000x700')
    root.resizable(False,False)
    root.mainloop()


Функция внутри mail_thread должна работать бесконечно.
  • Вопрос задан
  • 120 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы