【问题标题】:How can I keep my main tkinter window from freezing when opening another file (.pyw)?打开另一个文件(.pyw)时,如何防止我的主 tkinter 窗口冻结?
【发布时间】:2021-10-04 21:44:55
【问题描述】:

我的代码需要运行一个程序,该程序将下载图像并无限期地运行,直到被告知停止。问题是让 Tkinter 窗口保持活动状态,所以我运行代码,它开始工作但 Tkinter 窗口被冻结。 我尝试过线程化,但很难理解。注释掉的部分是我之前尝试过但没有工作的线程。 root.update_idletasks() 应该刷新小部件,但这不起作用。

def mainmenuControls(menuState):
    if menuState == "start" and selectionsExist():
        mainMenu("started")
        subprocess.run("run.bat", shell=True)
        root.update_idletasks()
        #thread = threading.Thread(target=subprocess.run("console.pyw", shell=True))
        #thread.start()
        mainMenu()

【问题讨论】:

  • 您在主线程中尝试调用subprocess.run() 立即的线程,从而导致与非线程版本相同的问题。您需要将 function 传递给Thread()(在这种情况下为subprocess.run),并通过args=kwargs= 指定其参数 - 这允许它在线程中实际调用.
  • 改用subprocess.Popen()

标签: python python-3.x tkinter


【解决方案1】:
def anewprocess():    
     subprocess.run("run.bat", shell=True)

def mainmenuControls(menuState):
        if menuState == "start" and selectionsExist():
            mainMenu("started")                 
            thread = threading.Thread(target=anewprocess)
            thread.start()
            mainMenu()

在这里,anewprocess 函数将在一个新线程中运行。 我想这可能会解决你的问题

请注意,您要提供给 Thread 的所有参数都应该在元组中。
例如:Thread(target=somefunction,args=(arg1,arg2,arg3))
如果您想了解有关线程的更多信息,请参阅https://www.geeksforgeeks.org/multithreading-python-set-1/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-11
    • 2018-05-18
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多