Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以安全地使用线程通过subprocess.call从Tkinter应用程序调用脚本吗?_Python_Multithreading_Python 2.7_Tkinter_Subprocess - Fatal编程技术网

Python 我可以安全地使用线程通过subprocess.call从Tkinter应用程序调用脚本吗?

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都可以运行。这是

所以我有一个Tkinter应用程序,我在工作中使用。我编写了另一个Tkinter应用程序,我想从Tkinter主应用程序调用它。我知道Tkinter不是“线程安全的”,但我不能100%确定这意味着什么。这是否意味着它可以“工作”,但不能保证按书面形式工作?还是根本不起作用

我问这个问题的原因是,当我运行下面的代码时(self.thread\u easy\u imaging()由一个filemenu选项触发),它可以正常工作。到目前为止,我还没有遇到任何问题,据我所知,这两个GUI都可以运行。这是因为我正在使用subprocess.call调用脚本吗?我很难理解这一点,因为我知道你不能在Tkinter应用程序中使用线程来执行类似于运行函数的操作,同时仍然能够使用GUI中的按钮,但由于某些原因,当我使用线程调用带有子进程的脚本时。call它做得很好。当我写它的时候,我认为它不会起作用,但出于某种奇怪的原因,它确实起作用了。下面是我正在使用的代码示例:

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可以从多个线程中使用。