Python 我可以安全地使用线程通过subprocess.call从Tkinter应用程序调用脚本吗?
所以我有一个Tkinter应用程序,我在工作中使用。我编写了另一个Tkinter应用程序,我想从Tkinter主应用程序调用它。我知道Tkinter不是“线程安全的”,但我不能100%确定这意味着什么。这是否意味着它可以“工作”,但不能保证按书面形式工作?还是根本不起作用 我问这个问题的原因是,当我运行下面的代码时(self.thread\u easy\u imaging()由一个filemenu选项触发),它可以正常工作。到目前为止,我还没有遇到任何问题,据我所知,这两个GUI都可以运行。这是因为我正在使用subprocess.call调用脚本吗?我很难理解这一点,因为我知道你不能在Tkinter应用程序中使用线程来执行类似于运行函数的操作,同时仍然能够使用GUI中的按钮,但由于某些原因,当我使用线程调用带有子进程的脚本时。call它做得很好。当我写它的时候,我认为它不会起作用,但出于某种奇怪的原因,它确实起作用了。下面是我正在使用的代码示例:Python 我可以安全地使用线程通过subprocess.call从Tkinter应用程序调用脚本吗?,python,multithreading,python-2.7,tkinter,subprocess,Python,Multithreading,Python 2.7,Tkinter,Subprocess,所以我有一个Tkinter应用程序,我在工作中使用。我编写了另一个Tkinter应用程序,我想从Tkinter主应用程序调用它。我知道Tkinter不是“线程安全的”,但我不能100%确定这意味着什么。这是否意味着它可以“工作”,但不能保证按书面形式工作?还是根本不起作用 我问这个问题的原因是,当我运行下面的代码时(self.thread\u easy\u imaging()由一个filemenu选项触发),它可以正常工作。到目前为止,我还没有遇到任何问题,据我所知,这两个GUI都可以运行。这是
def thread_easy_imaging(self):
thread.start_new_thread(self.start_easy_imaging, ('EASY-IMAGING-1', 0))
def start_easy_imaging(self, thread_name, delay):
time.sleep(delay) #have to have args for some reason? I just did a delay of 0 seconds so I could use the tuple.
subprocess.call(['c:/python27/python.exe', 'EasyImaging.py'])
self.thread_easy_imaging()
我只在windows机器上使用过它,但我猜它应该适用于任何操作系统
编辑:脚本根本不需要交互,我只想将另一个GUI应用程序添加到filemenu中,这样我就可以将其作为单独的应用程序调用。如果需要,我将使用顶级小部件重新创建我想要调用的应用程序,因为它根本不会破坏主线程
提前谢谢 无关:不要直接使用
线程
模块;改用线程
模块。您可以使用subprocess.Popen
来避免创建不必要的线程。为什么您要使用子流程
而不是导入您的_模块
来运行Python代码?@J.F.Sebastian,我没有意识到导入我的脚本会起作用:P Edit:只是尝试了一下,它不起作用。。我会调查一下Popen,“不起作用”不是很有信息性,导入另一个脚本对我来说不起作用。我正在研究Popen,但我想知道更多关于Tkinter在使用线程时的限制。你知道他们是否只是不安全,或者他们的方法是安全的吗?什么是“不跑”的意思?您希望发生什么(屏幕上的输出、保存的新文件等)?会发生什么?如果您使用的是子进程
,那么Tkinter是否线程安全无关紧要:它位于另一个进程中。除非有理由;您应该使用导入一些_模块;some\u模块。调用\u some\u funcs()
而不是作为子进程运行some\u模块。Tkinter可以从多个线程中使用。