首先说,这个现象是正常的,原因是Windows的事件循环。关于更多Windows事件循环的知识点可以查阅相关资料。
Windows系统上每一个按钮都对应一个按钮事件,也就是你的testbuttoncommand这个回调函数,在点击按钮时,Windows系统就会生成一个点击事件,放到事件循环的待处理队列中,然后交由事件循环去依次去处理队列中的事件,处理的过程中系统会自动调用这个回调函数。
一般来说,事件循环上的回调函数时不允许做耗时操作的,耗时操作需要放到其他线程中去。
你在回调函数中调用了os.system这个函数,os.system会通过cmd的方式启动test2.py,此时新打开的notepad++是cmd的子进程,在cmd的子进程不退出的情况下,os.system函数是不会返回的,所以此时回调函数就会被阻塞在这里了。
在回调函数不返回的情况下,你会发现界面也会卡住,因为在处理按钮事件时事件循环被阻塞了,导致事件循环无法正常处理其他事件了,所以界面也不会响应我们对他所做的任何操作,包括但不限于拖动,点击退出按钮,最大化等等。
所以说如果需要耗时操作的话,可以在回调函数中新开线程,来处理耗时操作。
附上新开线程的参考方法,我尽量以最小改动的方式来修改,但是这样实现不是特别优雅。
还是需要根据你的需要进行具体的修改。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import threading
import tkinter
import os
test1 = tkinter.Tk()
def testbuttoncommand():
threading.Thread(target=lambda: os.system("test2.py"), args=()).start()
testbutton = tkinter.Button(text="testbutton", command=testbuttoncommand)
testbutton.place(x=1, y=1)
test1.mainloop()