【问题标题】:How to stop my Tkinter window from freezing?如何阻止我的 Tkinter 窗口冻结?
【发布时间】:2020-05-30 12:36:17
【问题描述】:

以下是我用来运行两个 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()

【问题讨论】:

  • 在你的其他脚本中你又调用了 tk.Tk 吗?
  • 请修正发布代码的格式。

标签: python multithreading tkinter


【解决方案1】:

我假设你的 Test1Test2 函数有点无限,所以我创建了这个作为我的 Test1.pyTest2.py 的格式:

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

现在,对于您的代码,我强烈建议您放弃当前的格式,转而使用 Object Oriented Programming,因为这样可以为您省去很多麻烦!

这是我为使它工作而编写的代码:

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 中管理多线程模块的问题,您可以继续编写更多代码!

希望这会有所帮助,

詹姆斯

附言

如果您在Test1/Test2.py 中使用tk.Tk() 窗口,则可以改用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()

【讨论】:

    猜你喜欢
    • 2018-10-31
    • 2018-09-26
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多