Как предотвратить зависание моего окна Tkinter? - PullRequest
0 голосов
/ 30 мая 2020

Ниже приведена основная функция, которую я использую для запуска двух файлов python, но как только я нажимаю на кнопку, мое окно зависает. Подскажите, пожалуйста, способ выполнения многопоточности, чтобы я мог одновременно нажимать обе кнопки .

import pandas as pd

import numpy as np

from tkinter import *

from tkinter.ttk import *

from tkinter import messagebox

import threading

import Test1

import Test2

# In[ ]:



def Load1():



    Test1.func()

    messagebox.showinfo( "Successful","Reconcilation Complete")



def Load2():

    Test2.func()

    try:

        messagebox.showinfo( "Successful","Reconcilation Complete")

    except Exception as inst:

        messagebox.showinfo( "Unsuccessful",inst)

root = Tk()



root.geometry('375x100')

root.title("Reco")



root.configure(background="LightBlue2")

style = Style()

style.configure('TButton', background = 'SeaGreen2', font =

               ('calibri', 20, 'bold'))



btn1 = Button(root, text = 'Tier Recon', command =threading.Thread(target=Load1).start )

btn1.grid(row = 1, column = 3, pady = 10, padx = 100)



btn2 = Button(root, text = 'View Recon', command =threading.Thread(target=Load2).start)

btn2.grid(row = 2, column = 3, pady = 10, padx = 100)



root.mainloop()

1 Ответ

1 голос
/ 30 мая 2020

Я предположил, что ваши функции Test1 и Test2 несколько бесконечны, поэтому я создал это как формат для моих Test1.py и Test2.py:

# Test1.py / Test2.py
import tkinter as tk
def func():
    while True:
        root = tk.Tk()
        root.mainloop()

Теперь с вашим кодом я настоятельно рекомендовал бы отойти от вашего текущего формата и перейти к объектно-ориентированному программированию , так как это избавит вас от многих головных болей в будущем!

Вот код, который я написал, чтобы он работал :

import tkinter as tk
import tkinter.ttk as ttk
import Test1
import Test2

class reco_win:
    def __init__(self, master):
        self.master = master
        self.master.geometry('375x100')
        self.master.configure(background="LightBlue2")
        style = ttk.Style()
        style.configure('TButton', background = 'SeaGreen2', font =
                ('calibri', 20, 'bold'))

        btn1 = ttk.Button(self.master, text = 'Tier Recon', command = lambda: self.master.after(1, self.load1))

        btn1.grid(row = 1, column = 3, pady = 10, padx = 100)

        btn2 = ttk.Button(self.master, text = 'View Recon', command =lambda: self.master.after(1, self.load1))

        btn2.grid(row = 2, column = 3, pady = 10, padx = 100)

    def load1(self):
        Test1.func()

    def load2(self):
        Test2.func()

def main():
    root = tk.Tk()
    reco_win(root)
    root.mainloop()

if __name__ == '__main__':
    main()

Важный бит в этом коде:

self.master.after(1, self.load1)

Эта строка кода делает через 1 миллисекунду асинхронно запускает новый поток и выполняет функцию Test1.func() .

Это означает, что вам не нужно беспокоиться о проблемах с управлением модулем многопоточности в python, и вместо этого вы можете работать над написанием большего количества кода!

Надеюсь, это поможет,

Джеймс

PS

Если вы используете окно tk.Tk() в своем Test1/Test2.py, вы можете вместо этого использовать окно tk.TopLevel, которое позволит вам переписать этот код читать так:

import tkinter as tk
import tkinter.ttk as ttk
import Test1
import Test2

class reco_win:
    def __init__(self, master):
        self.master = master
        self.master.geometry('375x100')
        self.master.configure(background="LightBlue2")
        style = ttk.Style()
        style.configure('TButton', background = 'SeaGreen2', font =
                ('calibri', 20, 'bold'))

        btn1 = ttk.Button(self.master, text = 'Tier Recon', command = self.load1)

        btn1.grid(row = 1, column = 3, pady = 10, padx = 100)

        btn2 = ttk.Button(self.master, text = 'View Recon', command =self.load2)

        btn2.grid(row = 2, column = 3, pady = 10, padx = 100)

    def load1(self):
        top = tk.Toplevel()
        tk.Label(top, text="Hello").grid(row=0, column=0)

    def load2(self):
        top2 = tk.Toplevel()
        tk.Label(top2, text="Hello 2").grid(row=0, column=0)

def main():
    root = tk.Tk()
    reco_win(root)
    root.mainloop()

if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...